cf彩笔题解1673A-C
A
分析
Alice先手并取偶数长度的子串,Bob后手并取奇数长度的子串,如果是偶数长度就直接取完,否则判断一下第一个字符和最后一个字符谁大,留一个小的给Bob剩下的全部取完就行
code
#include<iostream>
#include<cstring>
using namespace std;
int t;
string s;
int main()
{
cin>>t;
while(t--)
{
cin>>s;
int n=s.lenght();
int ans=0;
for(int i=0;i<n;i++)
ans+=s[i]-'a'+1;
if(n&1)
{
if(n==1)
cout<<"Bob"<<ans<<endl;
else cout<<"Alice "<<max(ans-2*(s[0]-'a'+1),ans-2*(s[n-1]-'a'+1))<<endl;
}
else
{
cout<<"Alice"<<ans<<endl;
}
}
return 0;}
B
分析
首先存储一下字符串中出现了几种字符,然后查找两个相同字符的差值是否>=字符的种类,如果没有则直接输出NO(即一定存在某个字符没有出现在两个相同字符形成的子串中,0和2差值大于1),判断完整个循环没有输出NO即输出YES
code
#include<iostream>
#include<cstring>
using namespace std;
int t,v[26];
char s[200010];
void vv()
{
cin>>s;
int m=0,i,c;
int n=strlen(s);
memset(v,0,sizeof(v));
for( i=0;i<n;i++)
{
c=s[i]-'a';
if(!v[c]) v[c]=1;
else
{
m=i;
break;
}
}
if(!m)
{
puts("YES");
return ;
}
int f=1;
for(int i=m,j=0;i<n;i++,j=(j+1)%n)
if(s[i]!=s[j])
{
f=0;
break;
}
puts(f?"YES":"NO");
}
int main()
{
cin>>t;
while(t--)
{
vv();
}
return 0;}
C
分析
先预处理出前4e4中有多少回文数,然后就是用完全背包的板子
code
#include<iostream>
#include<cstring>
using namespace std;
const int N=4e4+10;
const int mid=1e9+7;
int f[N],s[N];
bool v[N];
bool hui(int x)
{
int i=x;
int m=0;
while(i>0)
{
m=m*10+i%10;
i/=10;
}
return m==x;
}
int main()
{
int n;
v[0]=true;
int cnt=0;
cin>>n;
for(int i=1;i<N-10;i++)
{
if(hui(i))
f[++cnt]=i;
}
s[0]=1;
for(int i=1;i<=cnt;i++)
for(int j=f[i];j<=N;j++)
s[j]=(s[j]+s[j-f[i]])%mid;
while(n--)
{
int t;
cin>>t;
cout<<s[t]<<endl;
}
return 0;}

浙公网安备 33010602011771号