http://codeforces.com/contest/989/problem/C
这磨人的小妖精……
贪心,不难发现正确性,用一个A、B、C、D、分别哪拿一个出来画框,每一个框处理一种字母
例如一个框长这样:
加层后长这样:
反正都只花费1个A
处理字母后长这样:
我用1个A画框来处理剩余B,1个B画框来处理剩余C,以此类推。
我的框长度都为50,如果有字母要处理,框占2行,字母2行,不够再2行,最多6行就可以处理完100个字符。(因为每2行处理49个)。
处理一个字符最多8行,4*8=32,50行是足够的。
1 public class Main {
2
3 public static void main(String[] args) {
4 Scanner io = new Scanner(System.in);
5
6 char[][] ans = new char[200][200];
7 //ans[p1][]:正在处理的字符串
8 int p1 = 0;
9 int[][] a = new int[4][2];
10
11 for (int i = 0; i < 4; i++) {
12 a[i][0] = io.nextInt();
13 a[i][1] = 'A' + i;
14 }
15
16 for (int i = 0; i < 4; i++) {
17
18 //框字符ch1,处理字符ch2,有num个ch2处理
19 int j = i == 3 ? 0 : i + 1;
20 char ch1 = (char) a[i][1], ch2 = (char) a[j][1];
21 //不管num个数多少,都画框
22 for (int k = 0; k < 50; k++) ans[p1][k] = ch1;
23 p1++;
24
25 int num = a[j][0] - 1;
26 //处理ch2
27 if (num>0){
28 //x是处理行1,y是处理行2,z是列指针,v在01之间不停变换
29 int x = p1, y = p1 + 1, z = 0, v = 0;
30 char[] t = new char[]{ch1, ch2};
31 //框的右边界
32 ans[p1][49]=ans[p1+1][49]=ch1;
33 p1+=2;
34 while (num-- > 0) {
35 //2行不够
36 if (z==49){
37 for (int k = 0; k < 50; k++) ans[y+1][k]=ch1;
38 x+=3;y+=3;p1+=3;z=0;v^=1;
39 ans[x][49]=ans[y][49]=ch1;
40 }
41 //画ch2
42 ans[x][z] = t[v];
43 ans[y][z++] = t[v^=1];
44 }
45 //处理完ch2后补全字符串后面的空余部分
46 for (int k=z;ans[x][k]==0&&z-1>=0;k++){
47 ans[x][k]=ans[x][z-1];
48 ans[y][k]=ans[y][z-1];
49 }
50 }
51 //画下半边框
52 for (int k = 0; k < 50; k++) ans[p1][k] = ch1;
53 p1++;
54 }
55
56 System.out.println(p1+" "+50);
57 for (int i = 0; i <p1; i++) System.out.println(new String(ans[i]).substring(0,50));
58 }
59 }