Codeforces Round #328(Div2)
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胜。
代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 6 char mp[10][10]; 7 8 int main() 9 { 10 for(int i=0;i<8;i++) 11 scanf("%s",mp[i]); 12 int minb=10,minw=10,fw,fb,flagb; 13 for(int i=0;i<8;i++) 14 { 15 fw=10;fb=10;flagb=0; 16 for(int j=0;j<8;j++) 17 { 18 if(mp[j][i]=='W') 19 { 20 if(flagb==0) 21 fw=min(fw,j); 22 else 23 fb=10; 24 } 25 if(mp[j][i]=='B') 26 { 27 28 flagb=1; 29 fb=min(8-j-1,fb); 30 } 31 } 32 minb=min(minb,fb); 33 minw=min(minw,fw); 34 } 35 if(minb>=minw) 36 printf("A\n"); 37 else 38 printf("B\n"); 39 }
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.
代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 6 int main() 7 { 8 long long n; 9 scanf("%I64d",&n); 10 printf("%I64d\n", (n-2)*(n-2)); 11 return 0; 12 }