题目大意:
给你 \(n^2\) 颗糖,分给 \(n\) 人,使每个人的权值相等(第 \(i\) 块的权值为 \(i\) ),输出第 \(i\) 个人选的糖果集合,注意题目中说 \(n\) 为偶数。
解题思路:
根据 \(1+2+\ldots+n-1+n= \dfrac{n}{2}(n+1)\) 的规律,总结出每组的权值的和其实都是 \(n^2+1\)。
从 \(\ 1\) 和 \(n^2\) 之间找出每一组相加为 \(n^2+1\) 的组合,这两个数是相对应的,如当 \(n\ =4\) 时,这 \(n\) 个人的权值可为 \(\ 1\) 和 \(\ 16\),\(\ 2\) 和 \(\ 15\),\(\ 3\) 和 \(\ 14\) 等;再把每一种组合都输出出来即可。
如何找出每一种组合?
把 \(n^2\) 分为两节,分别是从 \(1\) 到 \(\dfrac{n^2}{2}\),和从 \(n^2\) 到 $ \dfrac{n^2}{2}$,当第一节中的数字 \(i\) 与第二节中的数字 \(j\) 是一组时,\(i+j==n^2+1\);
所以只需要判断 \(i+j\) 是否与 \(n^2+1\) 相等。
当然,也可以直接从 \(1\) 到 \(\frac{n^2}{2}\) 找,先把每一个数都输出,再输出 \(n^2-i+1\)( \(\ 1\) 也可以加在 \(i\) 上)。
为什么要加 \(\ 1\) 呢?
因为第一组为 \(\ 1\) 和 \(n^2\),而不是 \(\ 0\) 和 \(n^2\)。
代码1:
#include<iostream>
using namespace std;
int n,b,c;
int main()
{
cin>>n;
b=n*n;
c=b/2;
for(int i=1;i<=c;i++) { //第一节查找
for(int j=b;j>=c;j--){ //第二节查找
if(i+j==b+1) //判断是否为一组
cout<<i<<' '<<j<<"\n";
}
}
return 0;
}
代码2:
#include<iostream>
using namespace std;
int n,b,c;
int main()
{
cin>>n;
b=n*n;
c=b/2;
for(int i=1;i<=c;i++) {
cout<<i<<' '<<b-i+1<<"\n";
}
return 0;
}
标签:dfrac,Bags,题目,输出,int,题解,CF334A,权值
From: https://www.cnblogs.com/zzyblog0619/p/17003659.html