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

    题目描述

    N堆纸牌,编号分别为 1,2,…,N1,2,,N。每堆上有若干张,但纸牌总数必为N的倍数。可以在任一堆上取若干张纸牌,然后移动。

    移牌规则为:在编号为1堆上取的纸牌,只能移到编号为2的堆上;在编号为N的堆上取的纸牌,只能移到编号为N1的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。

    现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。

    例如N=44堆纸牌数分别为:

    9②8③17④6

    移动3次可达到目的:

    从 ③ 取4张牌放到 ④ (9,8,13,10)-> 从 ③ 取3张牌放到 ②(9,11,10,10)-> 从 ② 取1张牌放到①(10,10,10,10)。

    输入输出格式

    输入格式:

     

    两行

    第一行为:NN 堆纸牌,1N100)

    第二行为:A_1,A_2, … ,A_n (N堆纸牌,每堆纸牌初始数,lAi10000)

     

    输出格式:

     

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

    输入输出样例

    输入样例:

    4 9 8 17 6

    输出样例:

    3

    思路:

    1.算平均数。

    2.求每堆纸牌与平均数的关系(多1记为1,少1记为-1)。

    3.当q[y](第y堆纸牌与平均数的关系)不等于0时,q[y+1]=q[y+1]+q[y],移动次数加1。

    标程

    #include<bits/stdc++.h>
    using namespace std;
    #define maxn 100005
    int que[maxn],tot,tto,m=0,n;
    int main()
    {
        int x;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>que[i];
            tot+=que[i];
        }
        tto=tot/n;//记录平均数 
        for(int i=1;i<=n;i++)
        {
                que[i]-=tto;//维护 
        }
        for(int i=1;i<=n;i++)
        {
            if(que[i]==0) continue;
            if(que[i]!=0)
            {
                que[i+1]+=que[i];
                m++;
            }//不等于0统统左移 
        }
        cout<<m<<endl;//输出 
    return 0;
    }
  • 相关阅读:
    C# 面向对象系列笔记(三)
    C# 面向对象系列笔记(二)
    分享一下: C# 面向对象系列笔记(一) ,希望对大家有所帮助
    新人报到
    VUE+ELEMENT-UI的后台项目封装组件--查询form的封装
    vue+element-ui的后台项目封装组件--面包屑的封装
    数组对象循环格式化时间撮的转换
    VUE+ELEMENT-UI的后台项目封装组件--table的封装
    css的样式问题
    vue项目兼容es6语法跟IE浏览器
  • 原文地址:https://www.cnblogs.com/lck-lck/p/9580364.html
Copyright © 2011-2022 走看看