[关闭]
@tenlee 2015-08-07T09:18:11.000000Z 字数 4975 阅读 1622

HDU 5308 I Wanna Become A 24-Point Master(2015多校联合)

HDUOJ 题解


题目链接:戳我

题目大意:

给定一个n,则对应一个长度2n1数组,此数组前 n 个数全为 n, 最后一个数必须是24,即 第 2*n-1 个数是24。
通过把这n个数加减乘除,每个数都必须用一次,且只能一次,并且运算完的数也都得用一次。也就是做n-1次。
输出过程 xi ? xj 第 i 个数与第 j 个数做 ? 运算 这种形式

样例解释:

4 n = 4 即a[1]=4,a[2]=4,a[3]=4,a[4]=4
1 * 2 表示 a[5]=a[1]a[2]=16
5 + 3 表示 a[6]=a[5]+a[3]=20
6 + 4 表示 a[7]=a[6]+a[4]=24
每个数都用了一次,且是 n - 1 次运算,每次运算的数均用上了

解题思路:

官方题解:
此处输入图片的描述

代码

  1. //Author LJH
  2. //www.cnblogs.com/tenlee
  3. #include <cstdio>
  4. #include <cstdlib>
  5. #include <cstring>
  6. #include <cctype>
  7. #include <cmath>
  8. #include <algorithm>
  9. #include <vector>
  10. #include <queue>
  11. #include <stack>
  12. #include <map>
  13. #define clc(a, b) memset(a, b, sizeof(a))
  14. using namespace std;
  15. const int inf = 0x3f;
  16. const int INF = 0x3f3f3f3f;
  17. const int maxn = 1e5+5;
  18. int n;
  19. void n15()
  20. {
  21. int i;
  22. printf("1 + 2\n");
  23. for(i = 1; i < 2; i++)
  24. {
  25. printf("%d + %d\n", n+i, i+2);
  26. }
  27. printf("%d / 4\n", n+2); //n+3 = 3
  28. printf("5 + 6\n"); // n + 4
  29. for(i = 7;i <= 12; i++)
  30. {
  31. printf("%d + %d\n", i, n+i-3);
  32. }
  33. printf("%d / %d\n", n+10, 13); //n+11 8
  34. printf("%d * %d\n", n+3, n+11); //n+12 3*8
  35. printf("14 - 15\n");//n+13
  36. for(i = n+14; i <= 2*n-2; i++)
  37. {
  38. printf("%d * %d\n", i-n+2, i-1);
  39. }
  40. printf("%d + %d\n", n+12, 2*n-2);
  41. }
  42. void n13()
  43. {
  44. int i;
  45. printf("1 + 2\n");
  46. for(i = 1; i < 2; i++)
  47. {
  48. printf("%d + %d\n", n+i, i+2);
  49. }
  50. printf("%d / 4\n", n+2); //n+3 = 3
  51. printf("5 + 6\n"); // n + 4
  52. for(i = 7;i <= 12; i++)
  53. {
  54. printf("%d + %d\n", i, n+i-3);
  55. }
  56. printf("%d / %d\n", n+10, 13); //n+11 8
  57. printf("%d * %d\n", n+3, n+11); //n+12 3*8
  58. }
  59. void n14()
  60. {
  61. puts("1 + 2"); //15 2*14
  62. puts("3 / 4"); //16 1
  63. puts("5 / 6"); //17 1
  64. puts("16 + 17");//18 2
  65. puts("7 / 8"); //19 1
  66. puts("9 / 10"); //20 1
  67. puts("19 + 20"); //21 2
  68. puts("18 + 21");//22 4
  69. puts("15 - 22"); //23 24
  70. puts("11 - 12");//24 0
  71. puts("13 - 14"); //25 0
  72. puts("24 + 25"); //26 0
  73. puts("26 + 23");// 27
  74. }
  75. void n4()
  76. {
  77. printf("1 * 2\n");
  78. printf("3 + 5\n");
  79. printf("4 + 6\n");
  80. }
  81. void n5()
  82. {
  83. printf("1 / 2\n");
  84. printf("6 / 3\n");
  85. printf("4 - 7\n");
  86. printf("5 * 8\n");
  87. }
  88. void n6()
  89. {
  90. printf("1 * 2\n");
  91. printf("7 - 3\n");
  92. printf("8 - 4\n");
  93. printf("9 - 5\n");
  94. printf("10 + 6\n");
  95. }
  96. void n7()
  97. {
  98. printf("1 * 2\n");
  99. printf("3 / 4\n");
  100. printf("5 + 6\n");
  101. printf("8 - 9\n");
  102. printf("11 / 10\n");
  103. printf("12 * 7\n");
  104. }
  105. void n8()
  106. {
  107. printf("1 + 2\n");
  108. printf("3 + 9\n");
  109. printf("4 - 5\n");
  110. printf("6 * 11\n");
  111. printf("7 * 12\n");
  112. printf("8 * 13\n");
  113. printf("10 + 14\n");
  114. }
  115. void n9()
  116. {
  117. printf("1 + 2\n");
  118. printf("3 + 10\n");
  119. printf("4 / 5\n");
  120. printf("6 / 7\n");
  121. printf("8 / 9\n");
  122. printf("11 - 12\n");
  123. printf("15 - 13\n");
  124. printf("16 - 14\n");
  125. }
  126. void n10()
  127. {
  128. puts("1 + 2"); //11 20
  129. puts("3 / 4");//12 1
  130. puts("5 / 6");// 13 1
  131. puts("7 / 8");//14 1
  132. puts("9 / 10");//15 1
  133. puts("11 + 12");//16 21
  134. puts("16 + 13");//17 22
  135. puts("17 + 14");//18 23
  136. puts("18 + 15");//18 24
  137. }
  138. void n11()
  139. {
  140. puts("1 + 2"); //12 22
  141. puts("12 / 3"); //13 2
  142. puts("4 + 5");//14 22
  143. puts("14 + 13"); //15 24
  144. puts("6 - 7");//16 0
  145. puts("8 - 9"); //17 0
  146. puts("10 - 11"); // 18 0
  147. puts("16 * 17");//19
  148. puts("18 * 19");//20
  149. puts("20 + 15");//21
  150. }
  151. void n12()
  152. {
  153. puts("1 + 2"); // 13 24
  154. puts("3 - 4"); // 14
  155. puts("14 * 5"); //15
  156. puts("15 * 6"); //16
  157. puts("16 * 7");//17
  158. puts("17 * 8");//18
  159. puts("18 * 9");//19
  160. puts("19 * 10");//20
  161. puts("20 * 11");//21
  162. puts("21 * 12");//22
  163. puts("22 + 13");//23
  164. }
  165. int main()
  166. {
  167. while(~scanf("%d", &n))
  168. {
  169. if(n < 4)
  170. {
  171. puts("-1");
  172. continue;
  173. }
  174. if(n == 4) n4();
  175. else if(n == 5) n5();
  176. else if(n == 6) n6();
  177. else if(n == 7) n7();
  178. else if(n == 8) n8();
  179. else if(n == 9) n9();
  180. else if(n == 10) n10();
  181. else if(n == 11) n11();
  182. else if(n == 12) n12();
  183. else if(n == 13) n13();
  184. else if(n == 14) n14();
  185. else
  186. {
  187. n15();
  188. }
  189. }
  190. }

标程

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cmath>
  4. #include<algorithm>
  5. #include<cstdio>
  6. using namespace std;
  7. int n;
  8. int main(){
  9. // freopen("data.in","r",stdin);
  10. // freopen("dataa.out","w",stdout);
  11. while (scanf("%d",&n)!=EOF){
  12. if (n>=15){
  13. printf("1 + 2\n"); printf("3 + 4\n"); printf("5 + 6\n"); printf("7 + 8\n"); printf("%d + 9\n",n+1);
  14. printf("%d / 10\n",n+2); printf("%d / 11\n",n+3); printf("%d / 12\n",n+4); printf("%d / 13\n",n+5);
  15. printf("%d * %d\n",n+6,n+7); printf("%d * %d\n",n+8,n+9); printf("%d * %d\n",n+10,n+11); printf("14 - 15\n");
  16. int now=n+13; for (int i=16;i<=n;i++){printf("%d * %d\n",i,now); now++;} printf("%d + %d\n",n+12,now); continue;
  17. }
  18. if (n>=12){
  19. printf("1 + 2\n");
  20. for (int i=1;i<=n*2-24;i++) printf("%d / %d\n",i*2+1,i*2+2); int num=n*4-46;
  21. int now=n+1+n*2-24;
  22. if (n!=12){
  23. printf("%d - %d\n",n+1,n+2); now++;
  24. for (int i=2;i<=n*2-24;i++){printf("%d - %d\n",now,n+1+i); now++;}
  25. }
  26. int k1=now;
  27. printf("%d - %d\n",num+1,num+2); num+=3; now++;
  28. for (int i=num;i<=n;i++){printf("%d * %d\n",i,now); now++;}
  29. printf("%d + %d\n",k1,now); continue;
  30. }
  31. if (n>=10){
  32. printf("1 + 2\n");
  33. for (int i=1;i<=24-n*2;i++) printf("%d / %d\n",1+2*i,2+2*i);
  34. printf("%d + %d\n",n+1,n+2); int now=n+26-n*2;
  35. for (int i=2;i<=24-n*2;i++) {printf("%d + %d\n",n+1+i,now); now++;}
  36. if (n==10) continue;
  37. printf("7 - 8\n"); printf("17 * 9\n"); printf("18 * 10\n"); printf("19 * 11\n"); printf("20 + 16\n"); continue;
  38. }
  39. if (n==9){
  40. printf("1 + 2\n"); printf("3 + 10\n"); printf("4 / 5\n"); printf("6 / 7\n"); printf("8 / 9\n");
  41. printf("11 - 12\n"); printf("15 - 13\n"); printf("16 - 14\n"); continue;
  42. }
  43. if (n==8){
  44. printf("1 + 2\n"); printf("3 + 9\n"); printf("4 - 5\n"); printf("6 * 11\n"); printf("7 * 12\n");
  45. printf("8 * 13\n"); printf("10 + 14\n"); continue;
  46. }
  47. if (n==7){
  48. printf("1 * 2\n"); printf("3 / 4\n"); printf("5 + 6\n"); printf("8 - 9\n"); printf("11 / 10\n"); printf("12 * 7\n"); continue;
  49. }
  50. if (n<=3){printf("-1\n"); continue;}
  51. if (n==6){
  52. printf("1 * 2\n"); printf("7 - 3\n"); printf("8 - 4\n"); printf("9 - 5\n"); printf("10 + 6\n"); continue;
  53. }
  54. if (n==5){
  55. printf("1 / 2\n"); printf("6 / 3\n"); printf("4 - 7\n"); printf("5 * 8\n"); continue;
  56. }
  57. if (n==4){
  58. printf("1 * 2\n"); printf("3 + 5\n"); printf("4 + 6\n"); continue;
  59. }
  60. }
  61. return 0;
  62. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注