• 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;
    }
  • 相关阅读:
    基础DP背包
    哲学思絮01
    Vue使用ElementUI
    Vue-Mock数据
    Vue生命周期
    Vue实战之CURD
    读《间客》有感
    ASP.Net Core网站发布
    Cycling之 标签化
    Vue环境搭建
  • 原文地址:https://www.cnblogs.com/lck-lck/p/9580364.html
Copyright © 2020-2023  润新知