CodeForces 592A
题意:在8*8棋盘里,有黑白棋,F1选手(W棋往上-->最后至目标点:第1行)先走,F2选手(B棋往下-->最后至目标点:第8行)其次。棋子数不一定相等,F1,F2中其中一个 棋子最先到达目标点对应方胜利。
思路:W,B棋子分别只能上、下,所以需知道:离第一行最近的W棋距离S1(并且这个W上方没有B),离第八行最近的B棋距离S2(这个B下方没有W)
胜利者为 S1<=S2?F1:F2
注意:S1==S2时 F1胜。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; char mp[][]; int main()
{
for(int i=;i<;i++)
scanf("%s",mp[i]);
int minb=,minw=,fw,fb,flagb;
for(int i=;i<;i++)
{
fw=;fb=;flagb=;
for(int j=;j<;j++)
{
if(mp[j][i]=='W')
{
if(flagb==)
fw=min(fw,j);
else
fb=;
}
if(mp[j][i]=='B')
{ flagb=;
fb=min(-j-,fb);
}
}
minb=min(minb,fb);
minw=min(minw,fw);
}
if(minb>=minw)
printf("A\n");
else
printf("B\n");
}
CodeForces 592B
题意:有n个点,点至点连线,若有阻隔,不可跳过。求被分隔成了多少块。当n=5时,如图所示。
思路:找规律。第一个点至其他点会被分割成 n-2块。一次画每个点,分别记录相比前一个状态多出的块数。发现第一个点周围的两个点是n-3块。其余点为n-4块
所以有 f[n]=(n-2)+2*(n-3)+(n-3)*(n-4) 化简:f[n]=(n-2)^2
注意:不要爆int,用long long 或_int64 输出格式%I64d.
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; int main()
{
long long n;
scanf("%I64d",&n);
printf("%I64d\n", (n-)*(n-));
return ;
}