codeforces 980B Marlin

题意:

有一个城市有4行n列,n是奇数,有一个村庄在(1,1),村民的活动地点是(4,n);

有一个村庄在(4,1),村民的活动地点是(1,n);

现在要修建k个宾馆,不能修建在边界上,问能否给出一种安排方案使得两个村庄的村民到他们各自的活动地点的最短路的条数相等。

思路:

画了几个实例就应该知道,无论n和k是多少,都可以构建出合理的方案,所以全是YES。

如果k为偶数,那么就上下对称,这个比较好构造;当k为奇数,我采用的是首先把第二排从中间开始向两边填满,然后第三排则是从中间一格的两边开始填。

忽略了k为0的情况,导致n发wa和n发rte,惨!

代码:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <string>
 4 #include <iostream>
 5 using namespace std;
 6 string a[4];
 7 int main()
 8 {
 9     int n,k;
10     scanf("%d%d",&n,&k);
11     puts("YES");
12     for (int i = 0;i < 4;i++)
13     {
14         for (int j = 0;j < n;j++) a[i].push_back('.');
15     }
16     if (k % 2 == 0)
17     {
18         int c = 1;
19         int l = 1;
20         while (1)
21         {
22             if (k <= 0) break;
23             a[c][l] = '#';
24             c++;
25             k--;
26             if (k <= 0) break;
27             if (c >= 3)
28             {
29                 c = 1;
30                 l++;
31             }
32         }
33     }
34     else
35     {
36         int l = n / 2,r = n / 2;
37         int c = 1;
38         while (1)
39         {
40             if (k <= 0) break;
41             a[c][l] = a[c][r] = '#';
42             if (l == r) k--;
43             else k-= 2;
44             if (k <= 0) break;
45             l--,r++;
46             if (l <= 0) break;
47         }
48         l =  n / 2 - 1,r = n / 2 + 1;
49         c = 2;
50         while (1)
51         {
52             if (k <= 0) break;
53             a[c][l] = a[c][r] = '#';
54             k -= 2;
55             l--,r++;
56         }
57     }
58     for (int i = 0;i < 4;i++) cout << a[i] << endl;
59     return 0;
60 }

 

posted @ 2018-05-09 02:40  qrfkickit  阅读(479)  评论(0编辑  收藏  举报