题目链接: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 }