• 洛谷 P1031 均分纸牌


    P1031 均分纸牌

    题目描述

    有 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<cstdio>
     3 using namespace std;
     4 
     5 int n,a[101],same,ans;
     6 
     7 int main()
     8 {
     9     cin>>n;
    10     for(int i=1;i<=n;i++){
    11         cin>>a[i];
    12         same+=a[i];
    13     }same/=n;
    14     for(int i=1;i<=n;i++){
    15         if(a[i]<same){
    16             a[i+1]-=same-a[i];
    17             ans++;
    18         }
    19         if(a[i]>same){
    20             a[i+1]+=a[i]-same;
    21             ans++;
    22         }
    23     }
    24     cout<<ans<<endl;
    25     return 0; 
    26 }
     
  • 相关阅读:
    job_queue_processes参数讲解
    Oracle trunc()函数的用法
    JSON字符串转JavaBean,net.sf.ezmorph.bean.MorphDynaBean cannot be cast to ……
    javax.swing.JList 设置分割线
    清除SVN版本控制文件
    MyEclipse SVN安装方法
    ExtJs xtype类型介绍
    Android中的“再按一次返回键退出程序”实现
    Android之NetworkOnMainThreadException异常
    HDU 3613 Best Reward
  • 原文地址:https://www.cnblogs.com/wsdestdq/p/6748989.html
Copyright © 2020-2023  润新知