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 }

 

转载于:https://www.cnblogs.com/kickit/p/9012058.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值