均分纸牌(贪心)

均分纸牌

Time Limit:1000MS  Memory Limit:65536K
Total Submit:241 Accepted:103

Description

有 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)。

Input

有多个测试案例,每个测试案例 
第1行输入N(N 堆纸牌,1 <= N <= 100) 
第2行输入A1 A2 … An (N 堆纸牌,每堆纸牌初始数,l<= Ai <=10000) 
如果输入N=0,则表示结束

Output

对每个测试案例,输出一行,内容为使所有堆均达到相等时的最少移动次数。

Sample Input

4
9 8 17 6
0

Sample Output

3【分析】其实这个思路我也不知道为什么就是移动的最小的;网上说贪心是一种直觉、、、然而 我又去网上搜了一下。。。。http://www.cppblog.com/jince/archive/2010/09/09/126231.aspx这位网友刨根问底的精神值得我去学习orz基于我很烂表达能力 贴一段一本通上的分析

如果你想到把每堆牌的张数减去平均张数,题目就变成移动正数,加到负数中,使大家都变成0,那就意味着成功了一半!拿例题来说,平均张数为10,原张数9,8,17,6,变为-1,-2,7,-4,其中没有为0的数,我们从左边出发:要使第1堆的牌数-1变为0,只须将-1张牌移到它的右边(第2堆)-2中;结果是-1变为0,-2变为-3,各堆牌张数变为0,-3,7,-4;同理:要使第2堆变为0,只需将-3移到它的右边(第3堆)中去,各堆牌张数变为0,0,4,-4;要使第3堆变为0,只需将第3堆中的4移到它的右边(第4堆)中去,结果为0,0,0,0,完成任务。

其实这个如果都减平均数 还要判断如果减去是0或者移动之后出现了0那么就不用移动了,下面的代码没有减去平均数,直接判断是否等于平均数然后再上面的思路,就不用麻烦看看是否出现0不用移动的特判了。【代码】
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 using namespace std;
 5 int Card[101],ave;
 6 int main()
 7 {
 8     int n,step=0;
 9     scanf("%d",&n);
10     for(int i=1;i<=n;i++)
11     {
12         scanf("%d",&Card[i]);
13         ave+=Card[i];
14     }
15     ave/=n;//平均值
16     for(int i=1;i<=n;i++)
17     {
18         if(Card[i]!=ave)//不等于平均数就向后一堆借
19         {
20             Card[i+1]+=Card[i]-ave;//后一堆分给前一堆;后一堆不够先为负,先让当前堆满足平均数。。。
21             step++;
22         }
23     }
24     printf("%d",step);
25     return 0;
26 }

 
时间: 2024-12-23 18:21:59

均分纸牌(贪心)的相关文章

code vs 1098 均分纸牌(贪心)

1098 均分纸牌 2002年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以在任一堆上取若于张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上:在编号为 N 的堆上取的纸牌,只能移到编号为 N-1 的堆上:其他堆上取的纸牌,可以移到相邻左边或右边的堆上. 现在要求找出一

Luogu P1031 均分纸牌(贪心)

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

均分纸牌(贪心求区间和为平均数的最多个数)

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

【贪心】均分纸牌

问题 B: [贪心]均分纸牌 时间限制: 1 Sec  内存限制: 64 MB提交: 39  解决: 18[提交][状态][讨论版] 题目描述 有N堆纸牌,编号分别为1,2,…,N.每堆上有若干张,但纸牌总数必为N的倍数.可以在任一堆上取若干张纸牌,然后移动. 移牌规则为:在编号为1堆上取的纸牌,只能移到编号为2的堆上:在编号为N的堆上取的纸牌,只能移到编号为N-1的堆上:其他堆上取的纸牌,可以移到相邻左边或右边的堆上. 现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多. 例如

贪心练习(一) 均分纸牌

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

【算法学习笔记】25.贪心法 均分纸牌问题的分析

贪心法: 贪?算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解. 贪心算法不是对所有问题都能得到整体最优解,关键是贪?心策略的选择,选择的贪?策略必须具备?后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关. 太概念化了.总结起来三点: 可行性:必须满足问题的约束 局部最优:当前步骤中所有可行的选择里最佳的局部选择. 不可取消:选择一旦做出,后面的步骤就无法改变. 问题要具有贪心选择性

P2512 [HAOI2008]糖果传递 - 贪心+中位数【环形均分纸牌问题】

P2512 [HAOI2008]糖果传递 Sol: 环形均分纸牌问题 考虑最基本的均分纸牌问题,相当于将环从1与n之间断开. 令\(res_i\)表示第\(i\)个人达到平均值所用步数,ave$表示糖果的平均数. 则 \(res_1=a_1-ave\) \(res_2=a_2-ave+res_1=a_1+a_2+2*ave\) \(res_3=a_3-ave+res_2=a_1+a_2+a_3-3*ave\) \(\dots\) \(res_i=a_i-ave+res_{i-1}=\sum_{j

CODEVS 2485 七夕祭 - 贪心+中位数【环形均分纸牌问题】

CODEVS 2485 七夕祭 Sol: 当行的平均值不为整数时,不能均分,列同理. 对行和列分别做一次环形均分纸牌问题. AC CODE: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 100000 + 100; int read(){ int x=0,f=1;char ch=' '; while(ch>'9'||ch<'0

均分纸牌(NOIP2000senior)解题报告

均分纸牌(NOIP2000senior) 解题报告 [题目描述] 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以在任一堆上取若于张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上:在编号为 N 的堆上取的纸牌,只能移到编号为 N-1 的堆上:其他堆上取的纸牌,可以移到相邻左边或右边的堆上. 现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多. 例如 N=4,4 堆纸牌数分别为: ① 9 ② 8 ③