P1031 均分纸牌(#2 -6)

13人阅读 评论(0) 收藏 举报
分类:

题目描述

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

输入输出格式

输入格式:

键盘输入文件名。文件格式:

N(N 堆纸牌,1 <= N <= 100)

A1 A2 … An (N 堆纸牌,每堆纸牌初始数,l<= Ai <=10000)

输出格式:

输出至屏幕。格式为:

所有堆均达到相等时的最少移动次数。

输入输出样例

输入样例#1:

4
9 8 17 6
输出样例#1:
3
———————————————————————————————————————————————

思路:把每堆牌的张数减去平均张数,题目就变成移动正数,加到负数中,使大家都变成0

源代码

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int n,a[10000];
    int sum=0,average,step=0;
    int i,j;

    cin>>n;
    for(i=1;i<=n;i++)	
    {
        cin>>a[i];//输入各堆张数
        sum+=a[i];//求总张数
    }
    
    average=sum/n;//求平均张数
    for(i=1;i<=n;i++)	a[i]-=average;//每堆牌数减去平均数
    
    for(i=1;a[i]==0&&i<n;)i++;//过滤左边的0
    for(j=n;a[j]==0&&j>1;)j--;//过滤右边的0

    for(;i<j;)
    {
        a[i+1]+=a[i];//将第i堆牌移到第i+1堆中去
        a[i]=0;//第i堆牌移走后变为0
        i++;//对下一堆牌进行循环操作
        step++;//移牌步数计数 
        while(a[i]==0&&i<j)	i++;//过滤移牌过程中产生的0
    } 

    cout<<step<<endl;

    return 0;
}
查看评论

P1031 均分纸牌

题目描述 n堆纸牌,用最少的移动次数使每堆纸牌数都一样多。 样例输入4 9 8 17 6 样例输出3 思路计算出平均值,把多的那堆纸牌推向少的那堆纸牌。 var i,j,k,l,z,x,w,r,s...
  • qq_34593871
  • qq_34593871
  • 2017-02-03 18:32:16
  • 193

【贪心】洛谷 P1031 均分纸牌

题目描述有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若于张纸牌,然后移动。移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆...
  • hyj542682306
  • hyj542682306
  • 2017-04-25 08:39:39
  • 139

洛谷P1031 均分纸牌

//贪心  #include #include #include #include #include #include #include #include #include #include #inc...
  • wr0831
  • wr0831
  • 2016-10-27 21:33:04
  • 120

P1031 均分纸牌(#2 - 2)

题目描述有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若干张纸牌,然后移动。移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆...
  • u011815404
  • u011815404
  • 2018-04-03 23:27:21
  • 18

vijos p1031均分纸牌

描述有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若于张纸牌,然后移动。移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;...
  • chenshibo17
  • chenshibo17
  • 2018-03-03 22:32:27
  • 14

luogu P1031 均分纸牌

P1031 均分纸牌 描述 见链接 分析 此题归类于模拟和贪心的,起初想用暴力模拟的,写出来非常复杂而且最后RE了非常尴尬。 后来看了看题解,就成了倒数字了,很简练有点抽象。 代码...
  • smmyy022
  • smmyy022
  • 2018-03-23 22:19:18
  • 9

NOip2002均分纸牌

题目描述 有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若于张纸牌,然后移动。 移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号...
  • yyyds
  • yyyds
  • 2016-08-15 20:36:42
  • 1115

洛谷 P1031 均分纸牌

题目描述有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若于张纸牌,然后移动。移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆...
  • liangzihao1
  • liangzihao1
  • 2017-01-16 11:29:05
  • 88

codevs均分纸牌 贪心算法

题目描述 Description 有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若于张纸牌,然后移动。   移牌规则为:在编号为 1...
  • glaugagefer
  • glaugagefer
  • 2015-04-21 00:50:22
  • 763

002-贪心算法求解“均分纸牌”

给定一堆牌,牌数总量记作cardCount。然后将这些牌分为n个堆,此时牌数总量cardCount必须是牌堆数n的倍数。求解使得移动最少次数的牌,使得n个堆上的牌的数量相等。...
  • qq_31698195
  • qq_31698195
  • 2017-03-15 14:57:57
  • 615
    个人资料
    持之以恒
    等级:
    访问量: 3万+
    积分: 3958
    排名: 9907
    文章存档
    最新评论