A
由于与运算不会把值变得更大,我们可以考虑将一个数不断与上别的数。
比如:对于第一个数,我们可以不断利用 \([1, 1]\)、\([1, 2]\)、……、\([1, n]\) 来让第一个数变成所有数与起来的值。其他位置上的数字可以通过再做一次上述操作得到所有数与起来的值。
于是答案就是所有数与起来的值。
代码:
#include <stdio.h>
int main(){
int t;
scanf("%d", &t);
for (int i = 1; i <= t; i++){
int n, ans = 0x7fffffff;
scanf("%d", &n);
for (int j = 1; j <= n; j++){
int a;
scanf("%d", &a);
ans &= a;
}
printf("%d\n", ans);
}
return 0;
}
B
首先,如果给定字符串全是 ?
,直接 B
和 R
交替即可;
如果给定字符串不全是 ?
但开头可能有一段 ?
,找到第一个非 ?
的字符,向前交替即可,向后依然交替,直到遇到下一个 ?
,向后交替即可,其他以此类推。
但这样怎么保证正确性呢?比如:B??B
,如果往 ??
中填入 RB
,结果有 \(2\) 个;如果填入 BR
,结果也有 \(2\) 个;
再比如:B??R
,如果往 ??
中填入 RB
,结果有 \(0\) 个;如果填入 BR
,结果也有 \(2\) 个。
于是在第一个 ?
前填入与第一个 ?
前相异的字母不会比其他方案更劣。
代码:
#include <stdio.h>
char s[107];
int main(){
int t;
scanf("%d", &t);
for (int i = 1; i <= t; i++){
int n, j = 1;
scanf("%d", &n);
scanf("%s", &s[1]);
s[n + 1] = ‘B‘;
while (j <= n && s[j] == ‘?‘) j++;
for (int k = j - 1; k >= 1; k--){
s[k] = s[k + 1] == ‘B‘ ? ‘R‘ : ‘B‘;
}
for (; j <= n; j++){
if (s[j] == ‘?‘) s[j] = s[j - 1] == ‘B‘ ? ‘R‘ : ‘B‘;
}
for (int k = 1; k <= n; k++){
printf("%c", s[k]);
}
printf("\n");
}
return 0;
}