Codeforces 980B
Posted coder-tcm
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces 980B相关的知识,希望对你有一定的参考价值。
渔托邦可以想象成一个 4行,奇数列的网格。 它有两个主要的村庄; 第一个位于左上角(1,1),在那里的人喜欢在右下角的池(4,n)捕鱼。 第二个村庄位于(4,1),人们喜欢在左下角(1,n)的鲑鱼池塘。
渔托邦的市长希望在城市中放置 k 个酒店,每个酒店都占用一个网格。 为了让人们可以从任何地方进入城市,不能将酒店放在边上。
如果这些单元格没有被酒店占用并且有一共同边,则一个人可以从一个单元移动到另一个单元。
你能帮助市长安排酒店,使从每个村庄到其池塘的最短路径的数量相等吗?
Input
第一行输入包含两个整数,n 和 k(3 ≤ n ≤ 99,0 ≤ k ≤ 2 ×(n - 2)),n是奇数。 n和k 代表城市的宽度,以及要建设的酒店数量 。
Output
如果可以以满足问题陈述的方式放置所有酒店,则输出“YES”,否则输出“NO”。
如果可能的话,输出另外 4 行描述城市的行,每行应该有 n 个字符,如果该单元格上有酒店,则字符是“#”,如果是空地,字符是“.” 。
Sample Input
Input
7 2
Output
YES ....... .#..... .#..... .......
Input
5 3
Output
YES ..... .###. ..... .....
题目要求从左上到右下和从左下到右上的最短路径的数目一样
考虑矩阵对称性
若n为偶数在第二行第三行(第二列开始)每次放两个 使矩阵关于x轴对称
若n为奇数先尽可能第二行放满(从中间向两边放),剩下的从两边向中间放,使矩阵关于y轴对称
第一遍在每个字符间多加了空格,wa了,找了半天。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int main() { char s[4][120]= {0}; int i,j,a,b,d,e; cin>>a>>b; memset(s,‘.‘,sizeof(s)); printf("YES "); if(b%2==0) { d=1; for(i=1; i<3; i++) { d=1; for(j=0; j<b/2; j++) s[i][d++]=‘#‘; } } else { e=b; s[1][a/2]=‘#‘; e--; for(i=1; i<a/2; i++) { if(e==0) break; s[1][a/2-i]=‘#‘; s[1][a/2+i]=‘#‘; e-=2; } if(e>0) { for(i=1; i<=e/2; i++) { s[2][i]=‘#‘; s[2][a-i-1]=‘#‘; } } } for(i=0; i<4; i++) { for(j=0; j<a; j++) { printf("%c",s[i][j]); } printf(" "); } return 0; }
以上是关于Codeforces 980B的主要内容,如果未能解决你的问题,请参考以下文章
[Codeforces Round #522 (Div. 2, based on Technocup 2019 Elimination Round 3)][C. Playing Piano](代码片段
Codeforces 86C Genetic engineering(AC自动机+DP)
CodeForces 1005D Polycarp and Div 3(思维贪心dp)