zoukankan      html  css  js  c++  java
  • 洛谷 P1031 均分纸牌 Label:续命模拟QAQ

    题目描述

    有 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

    代码

     1 #include<iostream>
     2 #include<cstring>
     3 #include<algorithm>
     4 #include<cstdio>
     5 using namespace std;
     6 int aver,N,a[9999],cnt;
     7 int main(){
     8 //    freopen("01.in","r",stdin);
     9     scanf("%d",&N);
    10     for(int i=1;i<=N;i++){
    11         scanf("%d",&a[i]);
    12         aver+=a[i];
    13     }
    14     aver/=N;
    15     for(int i=1;i<=N;i++){
    16         if(a[i]<aver){
    17             ++cnt;
    18             int block=aver-a[i];
    19             a[i+1]-=block;
    20             a[i]=aver;
    21         }
    22         else if(a[i]>aver){
    23             ++cnt;
    24             int block=a[i]-aver;
    25             a[i+1]+=block;
    26             a[i]=aver;
    27         }
    28     }
    29     printf("%d",cnt);
    30     return 0;
    31 }
    版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!
  • 相关阅读:
    一些基础的前端技术面试问题
    HTTP与HTTPS区别
    XML与JSON
    js的内置对象
    二分法查找
    img下面的留白解决
    大家好
    HEOI2020游记
    CSP-S2019游记
    省选模拟八十六 题解
  • 原文地址:https://www.cnblogs.com/radiumlrb/p/6033100.html
Copyright © 2011-2022 走看看