codeforces A. Candy Bags 解题报告

题目链接:http://codeforces.com/contest/334/problem/A

题意:有n个人,将1~n袋(第 i  袋共有 i  颗糖果,1<= i  <=n)所有的糖果(n*(n+1)/2)均分到n个人中。

       这里要注意的是输出问题,每行中的前n / 2(包括n/2)个数比较容易解决,就是每两个数中相隔n个长度,第n/2个数和第n/2+1个数之间隔了多少个长度,这是值得考虑的问题。我的做法是,由于每个人分到的糖果是 (n / 2) * (n*n+1)  (输出的n个数看成n/2个组合,每个组合有两个数,这两个数中的和恰好是n*n+1),所以用一个数组存储后半部分n/2+1 ~ n。例如输入的n为6,输出如下:

第一个人:  1     7      13   24  30  36

第二个人:  2   8     14   23  29  35

第三个人:  3   9     15    22  28  34

第四个人:  4   10        16    21       27       33

第五个人:    5         11        17         20        26      32

第六个人:  6   12         18        19        25      31

       以第一个人作为分析:1和36是一个组合,另外两个组合分别是7和30,13和24,当输出1的时候,计算出36(6*6+1-1),存入temp[0],输出7的时候,计算出30(37-7),存入temp[1],输出13,计算出24,存入temp[2],最后按逆序(2--->0)输出即可。可能方法有点笨,希望热心的读者可以提出些更好的方法,让我学习学习。

     

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 using namespace std;
 5 
 6 const int maxn = 10000 + 10;
 7 
 8 int main()
 9 {
10     int i, j, k, l, n, temp[maxn];
11     while (scanf("%d", &n) != EOF)
12     {
13         for (i = 1; i <= n; i++)
14         {
15             k = 0;
16             for (j = i; j <= (n * n / 2); j += n)
17             {
18                 if (j == i)
19                     printf("%d", j);
20                 else
21                     printf(" %d", j);
22                 temp[k++] = n * n + 1 - j;
23             }
24             for (l = n / 2 -1; l >= 0; l--)
25             {
26                 printf(" %d", temp[l]);
27             }
28             printf("\n");   
29         }
30     }
31     return 0;
32 }

     

原文地址:https://www.cnblogs.com/windysai/p/3220395.html