Codeforces Round #706 (Div. 2)
链接:https://codeforces.ml/contest/1496
A. Split it!
题意:``
题解:
1、k==0时,一定能找到;
2、判断s下标从0开始,只需判断第【0,k-1】与【n-k,n-1】区间内是否是一个回文字符串
3、其他不符合
代码:
`string s;
int t,n,k;
int fun()
{
for(int i=0,j=n-1;i<k;i++,j--)
if(s[i]!=s[j])return 0;
return 1;
}
int main()
{
cin>>t;
while(t--)
{
cin>>n>>k>>s;
if(k==0)
cout<<"YES"<<endl;
else if(n>k+k &&fun()) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
`
B. Max and Mex
题解:
根据k的范围最大到1e9,所以肯定是有规律的,一共分三种情况:
1、原数组中有空缺元素,最大值与空缺元素的和除二向上取整得到的元素在数组中存在
2、原数组中有空缺元素,最大值与空缺元素的和除二向上取整得到的元素在数组中不存在
3、原数组中没有空缺元素
参考题解:
int a[100010];
int main()
{
int t,n,k;
scanf("%d",&t);
while(t--)
{
set<int> s;
map<int,int>m;
int mi=0,ma=0;
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
//if(mi==a[i])mi++;//因为原数组中元素乱序,则不能直接按此方法
ma=max(ma,a[i]);
s.insert(a[i]);
m[a[i]]++;
}
for(set<int>::iterator it=s.begin();it!=s.end();it++)
{
if(mi==*it)mi++;
else break;
}
double y=(mi+ma)*1.0/2;
int x=round(y);
if(k==0||((mi<ma)&&m[x]>0))
cout<<s.size()<<endl;
else if((mi<ma)&&m[x]==0)
cout<<s.size()+1<<endl;
else if(mi==ma+1)
cout<<s.size()+k<<endl;
}
return 0;
}