0


2024年CCPC网络赛A题题解 —— 军训Ⅰ(gym105336A)

  1. ** 个人认为很唐的一道题,考虑到不少人可能懒得写,我这里给大家发个代码叭,还有一点点题解(因为真的不是很难)。这是题面:**

  1. 然后我来讲讲怎么做,不觉得会有多少人题目意思都理解不了叭?这个就是要求你构造一个n*m的方阵,满足经过无限次四种变换后恰好会出现四种本质不同的状态,这里的本质不同就是坐标不同的意思,大家可以好好理解下,然后我们通过手玩一部分的样例可以发现本质不同最多只会有13种状态,即k > 13的时候输出”No“,然后k12345678910111213的这几种情况中,k = 81012的时候是完全不行的,对于k = 5的时候我们发现当gcd(n,m) = 1的时候也是不可行的,上述是一部分的不可行情况。
  2. 我们的思路就是枚举k,对于每个k我们需要考虑nm都比较小的时候也会出现不可行方案,一般来讲就是分n <= 2,m <= 2或者n <= 3m <= 3的情况需要特殊考虑,因此剩下的我们就分k的大小构造答案就行:

** k = 1:全部站满**

** k = 2:空出一行或者一列**

** k = 3:空出不相邻的两行或者两列**

** k = 4:只放在(1,1)**

** k = 5: 一共存放LCM(n,m)个人,排列方式为每行逐渐平移下去,可以手玩一下,比如n = m = 3的情况:**

  1. ![](https://i-blog.csdnimg.cn/direct/a001d7b01eb54f7887bc3eb1643ba0e1.png)

** k = 6:放一个人到四个边界上的不同于端点的一点**

** 如n = 2,m = 3:**

  1. ![](https://i-blog.csdnimg.cn/direct/3d316e0a3e64415884619ef678a27bae.png)

** k = 7:第一行放满,然后把第一个人放到第二行第一个或者列同理:**

  1. ![](https://i-blog.csdnimg.cn/direct/f3f5558a2f9c4261b5ff62e24bf5fb4d.png)

** k = 9:直接在(2,2)放上一个,或者对于n = 2,m = 3或n = 3,m = 2的情况在(1,1)(n,m)各方一个就行**

** k = 11:对于n >= 2 && m >= 4 || n >= 4 && m >= 2,在(1,2)(2,1)(1,4)或者(4,1)上共放三个,然后对于n = 3,m = 3的时候在(1,1)和(3,2)各放一个即可**

** k = 13:直接放在(1 , 3)和(3,1)**

** 上述对于小范围数据需要加特判,然后没什么思维难度,对细节处理有一定要求,我直接放下代码:**

  1. #include<bits/stdc++.h>
  2. #define Alex std::ios::sync_with_stdio(false),std::cin.tie(0),std::cout.tie(0);
  3. #define int long long
  4. #define double long double
  5. const int QAQ = 0;
  6. const int mod = 998244353;
  7. const double pi = std::acos(-1.0);
  8. const double eps = 1e-10;
  9. char a[2005][2005];
  10. signed main()
  11. {
  12. Alex;
  13. int _;
  14. _ = 1;
  15. std::cin>>_;
  16. while(_--)
  17. {
  18. int n,m,k;
  19. std::cin>>n>>m>>k;
  20. for(int i = 1;i <= n;i++)
  21. for(int j = 1;j <= m;j++) a[i][j] = '-';
  22. if(k > 13)
  23. {
  24. std::cout<<"No"<<'\n';
  25. continue;
  26. }
  27. if(k >= 8 && k % 2 == 0)
  28. {
  29. std::cout<<"No"<<'\n';
  30. continue;
  31. }
  32. if(k == 5 && std::__gcd(n,m) == 1)
  33. {
  34. std::cout<<"No"<<'\n';
  35. continue;
  36. }
  37. if(k == 1)
  38. {
  39. std::cout<<"Yes"<<'\n';
  40. for(int i = 1;i <= n;i++)
  41. {
  42. for(int j = 1;j <= m;j++) std::cout<<'*';
  43. std::cout<<'\n';
  44. }
  45. continue;
  46. }
  47. if(k == 2)
  48. {
  49. if(n == 1 && m == 1)
  50. {
  51. std::cout<<"No"<<'\n';
  52. continue;
  53. }
  54. std::cout<<"Yes"<<'\n';
  55. if(n > 1)
  56. {
  57. for(int i = 1;i <= m;i++) std::cout<<'-';
  58. std::cout<<'\n';
  59. for(int i = 2;i <= n;i++)
  60. {
  61. for(int j = 1;j <= m;j++) std::cout<<'*';
  62. std::cout<<'\n';
  63. }
  64. }else
  65. {
  66. for(int i = 1;i <= n;i++)
  67. {
  68. std::cout<<'-';
  69. for(int j = 2;j <= m;j++) std::cout<<'*';
  70. std::cout<<'\n';
  71. }
  72. }
  73. continue;
  74. }
  75. if(k == 3)
  76. {
  77. if(n < 3 && m < 3)
  78. {
  79. if(n == 1 && m == 1)
  80. {
  81. std::cout<<"No"<<'\n';
  82. }
  83. if(n == 1 && m == 2)
  84. {
  85. std::cout<<"No"<<'\n';
  86. }
  87. if(n == 2 && m == 1)
  88. {
  89. std::cout<<"No"<<'\n';
  90. }
  91. if(n == 2 && m == 2)
  92. {
  93. std::cout<<"No"<<'\n';
  94. }
  95. continue;
  96. }
  97. std::cout<<"Yes"<<'\n';
  98. if(n >= 3)
  99. {
  100. for(int i = 1;i <= m;i++) std::cout<<'-';
  101. std::cout<<'\n';
  102. for(int i = 2;i <= n - 1;i++)
  103. {
  104. for(int j = 1;j <= m;j++) std::cout<<'*';
  105. std::cout<<'\n';
  106. }
  107. for(int i = 1;i <= m;i++) std::cout<<'-';
  108. std::cout<<'\n';
  109. }else
  110. {
  111. for(int i = 1;i <= n;i++)
  112. {
  113. std::cout<<'-';
  114. for(int j = 2;j <= m - 1;j++) std::cout<<'*';
  115. std::cout<<'-';
  116. std::cout<<'\n';
  117. }
  118. }
  119. continue;
  120. }
  121. if(k == 4)
  122. {
  123. if(n == 1 || m == 1)
  124. {
  125. std::cout<<"No"<<'\n';
  126. continue;
  127. }
  128. if(n >= 2 && m >= 2)
  129. {
  130. std::cout<<"Yes"<<'\n';
  131. std::cout<<'*';
  132. for(int j = 2;j <= m;j++) std::cout<<'-';
  133. std::cout<<'\n';
  134. for(int i = 2;i <= n;i++)
  135. {
  136. for(int j = 1;j <= m;j++) std::cout<<'-';
  137. std::cout<<'\n';
  138. }
  139. }
  140. continue;
  141. }
  142. if(k == 5)
  143. {
  144. std::cout<<"Yes"<<'\n';
  145. int lcm = n * m / std::__gcd(n,m);
  146. int every = lcm / n;
  147. for(int i = 1;i <= n;i++)
  148. for(int j = 1;j <= m;j++) a[i][j] = '-';
  149. int t = 1;
  150. every = m / every;
  151. for(int i = 1;i <= n;i++)
  152. {
  153. for(int j = t;j <= m;j = j + every) a[i][j] = '*';
  154. t++;
  155. if(t == every + 1) t = 1;
  156. }
  157. for(int i = 1;i <= n;i++)
  158. {
  159. for(int j = 1;j <= m;j++) std::cout<<a[i][j];
  160. std::cout<<'\n';
  161. }
  162. continue;
  163. }
  164. if(k == 6)
  165. {
  166. if(n >= 3 && m >= 2 || n >= 2 && m >= 3)
  167. {
  168. std::cout<<"Yes"<<'\n';
  169. if(n >= 3)
  170. {
  171. for(int i = 1;i <= m;i++) std::cout<<'-';
  172. std::cout<<'\n';
  173. std::cout<<'*';
  174. for(int i = 2;i <= m;i++) std::cout<<'-';
  175. std::cout<<'\n';
  176. for(int i = 3;i <= n;i++)
  177. {
  178. for(int j = 1;j <= m;j++) std::cout<<'-';
  179. std::cout<<'\n';
  180. }
  181. }else
  182. {
  183. std::cout<<'-'<<'*';
  184. for(int i = 3;i <= m;i++) std::cout<<'-';
  185. std::cout<<'\n';
  186. for(int i = 2;i <= n;i++)
  187. {
  188. for(int j = 1;j <= m;j++) std::cout<<'-';
  189. std::cout<<'\n';
  190. }
  191. }
  192. }else
  193. {
  194. std::cout<<"No"<<'\n';
  195. continue;
  196. }
  197. continue;
  198. }
  199. if(k == 7)
  200. {
  201. if(n >= 3 && m >= 2 || m >= 3 && n >= 2)
  202. {
  203. std::cout<<"Yes"<<'\n';
  204. for(int i = 1;i <= n;i++)
  205. for(int j = 1;j <= m;j++) a[i][j] = '-';
  206. if(n >= 3)
  207. {
  208. for(int i = 1;i <= m;i++) a[1][i] = '*';
  209. std::swap(a[1][1],a[2][1]);
  210. for(int i = 1;i <= n;i++)
  211. {
  212. for(int j = 1;j <= m;j++) std::cout<<a[i][j];
  213. std::cout<<'\n';
  214. }
  215. }else
  216. {
  217. for(int i = 1;i <= n;i++) a[i][1] = '*';
  218. std::swap(a[1][1],a[1][2]);
  219. for(int i = 1;i <= n;i++)
  220. {
  221. for(int j = 1;j <= m;j++) std::cout<<a[i][j];
  222. std::cout<<'\n';
  223. }
  224. }
  225. }else
  226. {
  227. std::cout<<"No"<<'\n';
  228. continue;
  229. }
  230. continue;
  231. }
  232. if(k == 9)
  233. {
  234. if(n >= 3 && m >= 3)
  235. {
  236. std::cout<<"Yes"<<'\n';
  237. for(int i = 1;i <= n;i++)
  238. for(int j = 1;j <= m;j++) a[i][j] = '-';
  239. a[2][2] = '*';
  240. for(int i = 1;i <= n;i++)
  241. {
  242. for(int j = 1;j <= m;j++) std::cout<<a[i][j];
  243. std::cout<<'\n';
  244. }
  245. }else
  246. if(n == 2 && m >= 3 || n >= 3 && m == 2)
  247. {
  248. std::cout<<"Yes"<<'\n';
  249. for(int i = 1;i <= n;i++)
  250. for(int j = 1;j <= m;j++) a[i][j] = '-';
  251. a[1][1] = '*';
  252. a[n][m] = '*';
  253. for(int i = 1;i <= n;i++)
  254. {
  255. for(int j = 1;j <= m;j++) std::cout<<a[i][j];
  256. std::cout<<'\n';
  257. }
  258. }else
  259. {
  260. std::cout<<"No"<<'\n';
  261. continue;
  262. }
  263. continue;
  264. }
  265. if(k == 11)
  266. {
  267. if(n >= 2 && m >= 4 || n >= 4 && m >= 2)
  268. {
  269. std::cout<<"Yes"<<'\n';
  270. if(n >= 2 && m >= 4)
  271. {
  272. for(int i = 1;i <= n;i++)
  273. for(int j = 1;j <= m;j++) a[i][j] = '-';
  274. a[1][2] = '*',a[2][1] = '*',a[1][4] = '*';
  275. for(int i = 1;i <= n;i++)
  276. {
  277. for(int j = 1;j <= m;j++) std::cout<<a[i][j];
  278. std::cout<<'\n';
  279. }
  280. }else
  281. {
  282. for(int i = 1;i <= n;i++)
  283. for(int j = 1;j <= m;j++) a[i][j] = '-';
  284. a[1][2] = '*',a[2][1] = '*',a[4][1] = '*';
  285. for(int i = 1;i <= n;i++)
  286. {
  287. for(int j = 1;j <= m;j++) std::cout<<a[i][j];
  288. std::cout<<'\n';
  289. }
  290. }
  291. }else
  292. if(n == 3 && m == 3)
  293. {
  294. std::cout<<"Yes"<<'\n';
  295. for(int i = 1;i <= n;i++)
  296. for(int j = 1;j <= m;j++) a[i][j] = '-';
  297. a[1][1] = '*';
  298. a[3][2] = '*';
  299. for(int i = 1;i <= n;i++)
  300. {
  301. for(int j = 1;j <= m;j++) std::cout<<a[i][j];
  302. std::cout<<'\n';
  303. }
  304. }
  305. else
  306. {
  307. std::cout<<"No"<<'\n';
  308. continue;
  309. }
  310. continue;
  311. }
  312. if(k == 13)
  313. {
  314. if(n >= 3 && m >= 3)
  315. {
  316. std::cout<<"Yes"<<'\n';
  317. for(int i = 1;i <= n;i++)
  318. for(int j = 1;j <= m;j++) a[i][j] = '-';
  319. a[1][3] = '*';
  320. a[3][1] = '*';
  321. for(int i = 1;i <= n;i++)
  322. {
  323. for(int j = 1;j <= m;j++) std::cout<<a[i][j];
  324. std::cout<<'\n';
  325. }
  326. }else
  327. {
  328. std::cout<<"No"<<'\n';
  329. continue;
  330. }
  331. continue;
  332. }
  333. }
  334. return QAQ;
  335. }
  1. OK辣,那么这道题目就被秒了~![](https://i-blog.csdnimg.cn/direct/933ba95022cc41f9a726dc339c96e059.jpeg)
标签: 网络 算法 c++

本文转载自: https://blog.csdn.net/Zz_0913/article/details/142066666
版权归原作者 Zz_0913 所有, 如有侵权,请联系我们删除。

“2024年CCPC网络赛A题题解 —— 军训Ⅰ(gym105336A)”的评论:

还没有评论