zoukankan      html  css  js  c++  java
  • P1031 均分纸牌

    链接:https://i.cnblogs.com/EditPosts.aspx?opt=1

    题目描述
    
    有 N 堆纸牌,编号分别为 12,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若干张纸牌,然后移动。
    
    移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N-1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。
    
    现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。
    
    例如 N=44 堆纸牌数分别为:
    
    ①98176
    
    移动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)
    
    输出格式:
    输出至屏幕。格式为:
    
    所有堆均达到相等时的最少移动次数。
    
    输入输出样例
    
    输入样例#14
    9 8 17 6
    输出样例#13
    题干

    思路:

      先求出平均数,然后都减去平均数,最后一摊一摊的向后推,推不完步数就加一

    #include<cstdlib>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    using namespace std;
    int  n,a[1100],f[1010],tot,ans,yu;
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)    scanf("%d",&a[i]),tot+=a[i];    
        tot=tot/n;    
        for(int i=1;i<=n;i++)    a[i]-=tot;
        int sum=0;
        for(int i=1;i<n;i++ )
        {
            a[i]=a[i]+sum;
            if(a[i]==0)    sum=0;
            else 
            {sum=a[i];ans++;}
        
        }
        cout<<ans;
        return 0;
    }
    代码
  • 相关阅读:
    CSS基础(十七)--Padding和margin(内边距和外边距)
    tomcat动态网站
    http和nginx错误定义
    nginx动态网站
    nginx动静分离
    nginx负载均衡
    nginx介绍
    cobbler服务器
    apache网络配置
    网络源
  • 原文地址:https://www.cnblogs.com/CLGYPYJ/p/7388629.html
Copyright © 2011-2022 走看看