http://codeforces.com/contest/626
直接暴力枚举n^2个子串,然后for一遍判断每个子串,左加右减,上加下减,看两个sum是否为零
分类讨论一下。。。
可以发现 当子串所含字母只有一个种类的时候,直接输出该种类
当子串含3个种类的时候,显然根据性质2,可以直接把整个串变成 BRG,最后能得到三个颜色
当种类的2的时候比较多情况一点:
如果两个种类个数都超过2,那么显然各拿出一个,根据性质1变出未出现的种类,那么又回到三种的情况了。
如果两个种类个数都为1,也就是BR,GR.BG,显然答案就是未出现过的字母
如果有一种个数不超过2,一个超过2,也就是BRR,GRR,BBG这样的情况,显然,他们得到两种结果,1是未出现过的字母,二是出现次数为1的字母.....如BRR的答案是 G和B
代码写得挫:
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std;
__int64 mod=1000000000+7;
char tm[205];
int vis[44];
int main()
{
int n,i,j;
cin>>n;
scanf("%s",tm+1);
for (i=1;i<=n;i++)
{
if (tm[i]=='B')
{vis[1]++;}
if (tm[i]=='R')
vis[2]++;
if (tm[i]=='G')
vis[3]++;
}
int cun=0;
for (i=1;i<=3;i++)
if (vis[i]) cun++;
if (cun==3)
{ printf("BGR\n");return 0;}
else
if (cun==1)
{
if (vis[1])
printf("B\n");
else if (vis[2])
printf("R\n");
else
printf("G\n");
return 0;
}
else
if (cun==2)
{
int cc=0;
for (i=1;i<=3;i++)
if (vis[i]>=2) cc++;
if (cc>=2) printf("BGR\n");
else
{
if (vis[2]&&vis[3])
{
if (vis[2]==1&&vis[3]==1) printf("B\n");
else
{
if (vis[3]>=2)
printf("BR\n");
else //RRG
printf("BG\n");
}
}
if (vis[2]&&vis[1])
{
if (vis[2]==1&&vis[1]==1) printf("G\n");
else
{
if (vis[2]>=2)
printf("BG\n");
else
printf("GR\n");
}
}
if (vis[1]&&vis[3])
{
if (vis[1]==1&&vis[3]==1) printf("R\n");
else
{
if (vis[1]>=2)
printf("GR\n");
else
printf("BR\n");
}
}
}
}
return 0;
}
本文提供了CodeForces 626竞赛中A题“Robot Sequence”和B题“Cards”的详细解题思路。对于A题,采用暴力枚举的方法判断子串的方向变化是否回到原点;对于B题,则通过分类讨论解决不同情况下子串能产生的颜色种类。


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



