纸牌问题,使用贪心可解。
一、纸牌均分
给定n堆纸牌,每堆纸牌有若干张,现要使着n堆纸牌平均分配,即每堆张数相等。每次移动可以使一堆牌向其左边的一堆或右边的一堆移动若干张牌。求最少移动次数。
这个题目相对简单,求出平均数,一一填平数组,其实不为零的数量就是结果了。
{ //t是纸牌总数 int ans = 0; for (int i = 1;i <= n;i ++) b[i] = a[i] - t / n; for (int i = 1;i <= n;i ++) { if (b[i] != 0) ans ++; b[i + 1] += b[i]; } }
二、每次只能移动一张牌的纸牌均分
和上道题差不多,只不过这回一次只能移动1张牌,每移动一次都要计入最后的移动步数。
同样使用贪心算法,只是计算最后的结果每次都是加上需要移动到下一次的纸牌数(可正可负)。
{ for (int i = 1;i <= n;i ++) b[i] = a[i] - t / n; for (int i = 1;i <= n;i ++) { sum[i] = sum[i - 1] + b[i]; ans += abs(sum[i]); } }
三、每次只能移动一张牌的环状纸牌均分
头尾直接可以交换数据,看代码。
{ for (int i = 1;i <= n;i ++) b[i] = a[i] - t / n; for (int i = 1;i <= n;i ++) sum[i] = sum[i - 1] + b[i]; sort(sum + 1,sum + n + 1); int ans = 0; for (int i = 1;i <= n;i ++) ans += abs(sum[i] - sum[(1 + n) / 2]); }
标签:纸牌,int,每堆,每次,均分,移动,步数 来源: https://www.cnblogs.com/kevin-lee123/p/16153676.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。