A
题意
思路:
签到题,我们注意到可以 任选一个区间,进行无数次操作。并且每次进行&运算肯定会让&运算后的数小于等于原来的值,所以最小的最大值肯定就是把所有数进行&运算得到的数。因为其中的最大值想变小,肯定要去和其他比他更小的值进行&运算,前面提到了每次&之后,只会让原来的数变小或者不变,所以对所有数进行&运算一定会得到所求答案。
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int t,n;
int a[N];
int main()
{
cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
int ans=a[1];
for(int i=2;i<=n;i++)
ans&=a[i];//每次&之后,只会让原来的数变小或者不变
cout<<ans<<endl;
}
return 0;
}
B
正解
#include<bitsdc++.h>
using namespace std;
const int N =110;
int T;
int n,m,k;
int main()
{
cin>>T;
while(T--)
{
char s[N];
cin>>n;
for(int i=1;i<=n;i++) cin>>s[i];
int pos=n+1;
for(int i=1;i<=n;i++)
{
if(s[i]!='?')
{
pos=i;
break;
}
}
for(int i=pos-1;i>=1;i--)
{
if(s[i]=='?') s[i]=(s[i+1]=='B'?'R':'B');
}
for(int i=pos+1;i<=n;i++)//末尾
{
if(s[i]=='?') s[i]=(s[i-1]=='B'?'R':'B');
}
for(int i=1;i<=n;i++) cout<<s[i];
cout<<endl;
}
return 0;
}
下面是错误的答案
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
typedef long long ll;
char s[106];
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>s[i];
for(int i=1;i<=n;i++)
{
if(s[i]=='?')
{
if(s[i-1]!='B'&&s[i+1]!='B')s[i]='B';//问题就出在这,我这样写就直接把字符串???B???的情况定死了,字符串首就定成了B,就成了BRRBRBR,而实际上的答案却是RBRBRBR
else if(s[i-1]!='R'&&s[i+1]!='R')s[i]='R';
else s[i]='R';
}
}
for(int i=1;i<=n;i++)
cout<<s[i];
cout<<endl;
}
return 0;
}