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 }
View Code

 

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 } 
View Code

 

posted @ 2016-05-26 18:17  初见、  阅读(279)  评论(0编辑  收藏  举报