AcWing 3777. 砖块(每日一题)
原题链接
思路
1.审题:判断出当B砖和W砖都为奇数个时不成立
每次翻转会使两个砖变为另一种颜色或两个砖交换颜色。所以颜色都为奇数个时将无法翻转成同一种颜色。
2.暴力 + 判暴力复杂度
思路:分别判断全为B或全为W时需要多少步。
方法:
- 从左到右==-1个==判断是否为需要颜色,不是就翻一下它和它后面的(-1的由来)。
- 判断最后一个和前面颜色是否相同,不同则选择另一个(下题解将此总数+1e7保证选到另一个)
时间复杂度:O(nt)(t组数,n操作数)
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| #include<bits/stdc++.h> using namespace std; const int N = 210; int n,m; string s,cp; int num1[N],sum1 = 0; int num2[N],sum2 = 0; void change(int i) { if(s[i] == 'B')s[i] = 'W'; else s[i] = 'B'; } int main() { int t;cin >> t; while(t --) { m = 0,sum1 = sum2 = 0; cin >> n >> s; for(int i = 0; i < n; i ++)cp[i] = s[i]; for(int i = 0; i < n; i ++) { if(s[i] == "B")m ++; } if(m % 2 == 1 && (n - m) % 2 == 1) { cout << "-1" << endl; continue; } for(int i = 0; i < n - 1; i ++) { if(s[i] != 'B') { change(i),change(i + 1); num1[++ sum1] = i + 1; } } if(s[n-1] == 'W')sum1 +=1e7; for(int i = 0; i < n; i ++)s[i] = cp[i]; for(int i = 0; i < n - 1; i ++) { if(s[i] != 'W') { change(i),change(i + 1); num2[++ sum2] = i + 1; } } if(s[n-1] == 'B')sum2 +=1e7; if(sum1 < sum2) { cout << sum1 <<endl; if(sum1 != 0) { for(int i = 1; i <= sum1; i ++)cout << num1[i] << " "; cout << endl; } }else { cout << sum2 <<endl; if(sum2 != 0) { for(int i = 1; i <= sum2; i ++)cout << num2[i] << " "; cout << endl; } } } }
|
问题(我出的)
- memcpy不能对string用,要换成char s[N]
- char,string的某一位s[i]与 字符 求 相等 时要用单引号而不是双引号!