Candy Bags 题解

题目传送门

题目大意:

给你 \(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; 
}
posted @ 2022-12-25 07:53  Ggsddu_zzy  阅读(12)  评论(0编辑  收藏  举报