AcWing 3777. 砖块(每日一题)

原题链接

思路

1.审题:判断出当B砖和W砖都为奇数个时不成立

每次翻转会使两个砖变为另一种颜色或两个砖交换颜色。所以颜色都为奇数个时将无法翻转成同一种颜色。

2.暴力 + 判暴力复杂度

思路:分别判断全为B或全为W时需要多少步。

方法:

  1. 从左到右==-1个==判断是否为需要颜色,不是就翻一下它和它后面的(-1的由来)。
  2. 判断最后一个和前面颜色是否相同,不同则选择另一个(下题解将此总数+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];
// cout << cp << endl;
for(int i = 0; i < n; i ++)
{
if(s[i] == "B")m ++;
}
if(m % 2 == 1 && (n - m) % 2 == 1)
{
cout << "-1" << endl;
continue;
}
// 化成全B
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;
// 化成全W
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;
}
}
}
}

问题(我出的)

  1. memcpy不能对string用,要换成char s[N]
image-20230330200432110
  1. char,string的某一位s[i]与 字符 求 相等 时要用单引号而不是双引号!
image-20230330200339142