均分纸牌问题(贪心)

网友投稿 841 2022-09-10

均分纸牌问题(贪心)

均分纸牌问题(贪心)

题目描述:

有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若于张纸牌,然后移动。 移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N-1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。 现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。 例如 N=4,4 堆纸牌数分别为: ①9②8③17④6 移动3次可达到目的: 从 ③ 取 4 张牌放到 ④ (9 8 13 10) -> 从 ③ 取 3 张牌放到 ②(9 11 10 10)-> 从 ② 取 1 张牌放到①(10 10 10 10)。

思路: 每一堆均分也就是找一个平均数,使得每一堆的数量都是这个数就可以了,从堆的两侧分别向中间遍历,如果大于这个平均数,就拿出来给旁边的一堆,如果小于,就从下一个堆里拿一定数量才凑够这个平均数,当left和right重合时,代表遍历完成,此时每一堆的数量都是这个平均数。

代码

#include #include using namespace std;int a[105]; int main(){ int n, i, j, t, sum=0, avg, left, right, count=0; cin>>n; for (i=1; i<=n; i++){ cin>>a[i]; sum+=a[i]; } avg=sum/n; left=1; right=n; while (leftavg){ t=a[left]-avg; a[left]=avg; a[left+1]+=t; count++; left++; } if (a[left]avg){ t=a[right]-avg; a[right]=avg; a[right-1]+=t; count++; right--; } if (a[right]

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:[区块链笔记5] truffle与合约交互前的web3.js预备
下一篇:字符串按位数分割(字符串按个数分割)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~