2015多校第二场1009(构造题)
题目坑就在坑在,输出太蛋疼!
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5308
题意:给n个值为n的数,每个用且用一次,经过+ - * / 得到24,中间得到的结果也可以用,输出每一步所用数字的编号 + 运算符 + 所用数字的编号。
n>=14时,可以发现,5个n得到4,7个n得到6.相乘得24,其余得0.
n<14时,打表。
代码:

1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 void solve(int n) 7 { 8 int k=6,kk=7; 9 int b=n+1; 10 printf("1 + 2\n"); 11 printf("3 + 4\n"); 12 printf("%d + %d\n",n+1,n+2); 13 printf("%d / 5\n",n+3); 14 b=n+5; 15 for(int i=0;i<3;i++) 16 { 17 printf("%d + %d\n",k,kk); 18 k+=2; 19 kk+=2; 20 b++; 21 } 22 printf("%d + %d\n",n+5,n+6); 23 printf("%d + %d\n",n+7,n+8); 24 printf("%d / 12\n",n+9); 25 printf("%d * %d\n",n+10,n+4); 26 int pos = n+11; //為24的點 27 b=n+12; 28 printf("13 - 14\n"); 29 for(int i=15;i<=n;i++) 30 { 31 printf("%d * %d\n",i,b); 32 b++; 33 } 34 printf("%d + %d\n",b,pos); 35 } 36 int main() 37 { 38 39 int n; 40 while(cin>>n) 41 { 42 if (n<=3) 43 { 44 printf("-1\n"); 45 continue; 46 } 47 if (n==4) 48 { 49 printf("1 * 2\n"); 50 printf("3 + 5\n"); 51 printf("4 + 6\n"); 52 continue; 53 } 54 if (n==5) 55 { 56 printf("1 / 2\n"); 57 printf("6 / 3\n"); 58 printf("4 - 7\n"); 59 printf("5 * 8\n"); 60 continue; 61 } 62 if (n==6) 63 { 64 printf("1 * 2\n"); 65 printf("7 - 3\n"); 66 printf("8 - 4\n"); 67 printf("9 - 5\n"); 68 printf("10 + 6\n"); 69 continue; 70 } 71 if (n==7) 72 { 73 printf("1 * 2\n"); 74 printf("3 / 4\n"); 75 printf("5 + 6\n"); 76 printf("8 - 9\n"); 77 printf("11 / 10\n"); 78 printf("12 * 7\n"); 79 continue; 80 } 81 if (n==8){ 82 printf("1 + 2\n"); 83 printf("3 + 9\n"); 84 printf("4 - 5\n"); 85 printf("6 * 11\n"); 86 printf("7 * 12\n"); 87 printf("8 * 13\n"); 88 printf("10 + 14\n"); 89 continue; 90 } 91 if (n==9) 92 { 93 printf("1 + 2\n"); 94 printf("3 + 10\n"); 95 printf("4 / 5\n"); 96 printf("6 / 7\n"); 97 printf("8 / 9\n"); 98 printf("11 - 12\n"); 99 printf("15 - 13\n"); 100 printf("16 - 14\n"); 101 continue; 102 } 103 if (n==10||n==11){ 104 printf("1 + 2\n"); 105 for (int i=1;i<=24-n*2;i++) printf("%d / %d\n",1+2*i,2+2*i); 106 printf("%d + %d\n",n+1,n+2); int now=n+26-n*2; 107 for (int i=2;i<=24-n*2;i++) {printf("%d + %d\n",n+1+i,now); now++;} 108 if (n==10) continue; 109 printf("7 - 8\n"); printf("17 * 9\n"); printf("18 * 10\n"); printf("19 * 11\n"); printf("20 + 16\n"); continue; 110 } 111 if (n==12||n==13){ 112 printf("1 + 2\n"); 113 for (int i=1;i<=n*2-24;i++) printf("%d / %d\n",i*2+1,i*2+2); int num=n*4-46; 114 int now=n+1+n*2-24; 115 if (n!=12){ 116 printf("%d - %d\n",n+1,n+2); now++; 117 for (int i=2;i<=n*2-24;i++){printf("%d - %d\n",now,n+1+i); now++;} 118 } 119 int k1=now; 120 printf("%d - %d\n",num+1,num+2); num+=3; now++; 121 for (int i=num;i<=n;i++){printf("%d * %d\n",i,now); now++;} 122 printf("%d + %d\n",k1,now); continue; 123 } 124 if(n>=14) 125 solve(n); 126 } 127 return 0; 128 }