Candy Bags / 糖果袋(整数算法问题)

这篇博客介绍了Gerald如何将不同数量糖果的n平方个袋子平均分配给n个弟弟的问题。每个弟弟应该得到相同数量的糖果,且每个袋子包含1到n平方的糖果。解决方案涉及从两端取袋子的策略,确保每个弟弟拿到n个袋子,总共n平方个糖果。文章提供了一个C语言的简单实现,并邀请读者批评指正。
摘要由CSDN通过智能技术生成

Gerald 有n个弟弟,并且他们的人数是偶数。一天,他买了n的二次方袋糖(比如2个弟弟,买了4袋糖),一个袋子有一颗糖,一个袋子有两颗糖,一个袋子有三颗糖,以此类推。事实上,对每一个从1到n的平方间(比如本例中的1到4)的整数k,他都有一个装有k颗糖果的袋子。

帮助他把n平方个袋子分给每一个弟弟使得所有弟弟得到相同数量的糖果。
输入
仅有一行,包括一个整数n,(n是偶数,2 ≤ n ≤ 100)——Gerald的弟弟的人数。
输出
假设Gerald对他的弟弟们从1到n的标号建了索引。你需要打印n行,在第i行打印n个整数——给第i个弟弟糖果袋的糖果数量。当然所有这些数字都应该是不同的,并且限制在1到n平方之间。你可以用任意的顺序打印这些行的数字。
要保证在给定限制下有解。
输入
2
输出
1 4
2 3
注意
测试用例是当Gerald有两个弟弟时他的分配结果。在这个例子中,他的糖果袋包括1,2,3和4颗糖果。他把装有1颗和4颗糖果的袋子给一个弟弟,把装有2颗和3颗的袋子给另一个弟弟。
输入输出样例:1组
#1
样例输入:
2
样例输出:
1 4
2 3


分析:有n个弟弟,有n*n个袋子,每个袋子的糖果数为1 2 3 …… …… n *n。 全部糖果要平均分给n个弟弟,且每个弟弟拿的袋子数为n。
所以拿了第一个的一个糖果的袋子的弟弟,就必须拿第n *n。
因此,定义两个变量 i k。 i从第一个袋子往后取,k从第n *n个袋子往前取。并且 i 只要取够n/2个,即,按照上面所讲的整体取够n个 就可以完成一个平分。

int n,i,k,num;
scanf
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
糖果问题是一道经典的贪心算法问题,其描述如下: 有一群小朋友和一些糖果,每个小朋友有一个评分值,用一个整数表示。现在你需要给这些小朋友分糖果,规则如下: 1. 每个小朋友至少分到一个糖果。 2. 评分高的小朋友必须比他旁边评分低的小朋友分到更多的糖果。 请问,至少需要准备多少个糖果,才能满足以上规则? 解题思路: 首先,我们可以将每个小朋友的评分值看作一个元素,构成一个数组 ratings。然后,我们可以定义一个叫做 candies 的数组,它的初始值全部为 1,表示每个小朋友都分到了一个糖果。 接下来,我们需要遍历两次数组 ratings。第一次遍历,从左到右,如果 ratings[i] 比 ratings[i-1] 大,则 candies[i] = candies[i-1] + 1,即比左边的小朋友多分配一个糖果。 第二次遍历,从右到左,如果 ratings[i] 比 ratings[i+1] 大,则 candies[i] = max(candies[i], candies[i+1]+1),即比右边的小朋友多分配一个糖果。 最后,将 candies 数组中所有元素相加,即为所求的最少需要准备的糖果数量。 代码实现: ``` int candy(vector<int>& ratings) { int n = ratings.size(); vector<int> candies(n, 1); for (int i = 1; i < n; i++) { if (ratings[i] > ratings[i-1]) { candies[i] = candies[i-1] + 1; } } for (int i = n-2; i >= 0; i--) { if (ratings[i] > ratings[i+1]) { candies[i] = max(candies[i], candies[i+1]+1); } } int ans = 0; for (int i = 0; i < n; i++) { ans += candies[i]; } return ans; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值