https://codingcompetitions.withgoogle.com/codejam/round/000000000043585d/0000000000754750#analysis
只会前2个set,也就是n<=2
n=1时,比较一下s和q-s哪个大,如果q-s大就对答案全部取反期望得分就是q-s,否则就输出当前的答案,那么得分就是s
n=2a时,设得分分别为as,bs,a[i]!=b[i]的位置一共cnt个,那么这cnt个一定是一边得分一边不得分,那么可以计算出q-cnt这些相同的部分只得了sc1=(as+bs-cnt)/2分
所以相同的位置同样考虑取反得q-cnt-sc分还是不取反得sc,然后不同的位置考虑按a的来就是as-sc分,按b就是bs-sc分
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxl=510;
int n,m,ans;
int as,bs;
char a[maxl],b[maxl],c[maxl];
inline void prework()
{
scanf("%d%d",&n,&m);
scanf("%s",a+1);scanf("%d",&as);
if(n==2)
{
scanf("%s",b+1);scanf("%d",&bs);
}
}
inline void mainwork()
{
if(n==1)
{
int ares=m-as;ans=0;
if(as>ares)
{
for(int i=1;i<=m;i++)
printf("%c",a[i]);
printf(" ");
printf("%d/1\n",as);
}
else
{
for(int i=1;i<=m;i++)
printf("%c",'T'+'F'-a[i]);
printf(" ");
printf("%d/1\n",ares);
}
}
else
{
int cnt=0;ans=0;
for(int i=1;i<=m;i++)
if(a[i]!=b[i])
cnt++;
if((as+bs-cnt)>m-cnt)
{
for(int i=1;i<=m;i++)
if(a[i]==b[i])
c[i]=a[i];
ans=(as+bs-cnt)/2;
}
else
{
for(int i=1;i<=m;i++)
if(a[i]==b[i])
c[i]='T'+'F'-a[i];
ans=m-cnt-(as+bs-cnt)/2;
}
if(as>bs)
{
ans+=as-(as+bs-cnt)/2;
for(int i=1;i<=m;i++)
if(a[i]!=b[i])
c[i]=a[i];
}
else
{
ans+=bs-(as+bs-cnt)/2;
for(int i=1;i<=m;i++)
if(a[i]!=b[i])
c[i]=b[i];
}
for(int i=1;i<=m;i++)
printf("%c",c[i]);
printf(" ");
printf("%d/1\n",ans);
}
}
int main()
{
int t;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
prework();
printf("Case #%d: ",i);
mainwork();
}
return 0;
}
优化算法:单例问题与字符串比较的竞赛解题技巧
这篇博客讲解了如何在CodeJam竞赛中解决n=1和n=2特殊情况下的字符串操作问题,涉及取反策略和得分计算。作者详细剖析了不同情况下的解题思路,包括单个字符比较和两个字符串的异同处理。
222

被折叠的 条评论
为什么被折叠?



