zoukankan      html  css  js  c++  java
  • 贪心训练均分纸牌Noip2002


    题目链接:https://www.luogu.com.cn/problem/P1031


    题目描述

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

       移牌规则为:在编号为1堆上取的纸牌,只能移到编号为2的堆上;在编号为N的堆上取的纸牌,只能移到编号为N1的堆上;

             其他堆上取的纸牌,可以移到相邻左边或右边的堆上。

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

       例如 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 堆纸牌,1N100)

       第二行为:A1,A2,,An (N堆纸牌,每堆纸牌初始数,1Ai10000)

    输出格式

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

    输入输出样例

     输入 #1

    4
    9 8 17 6

    输出 #1
    3
    
    
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int MAXN=10001;
     4 int a[MAXN];
     5 int main(){
     6     int n,sum=0,ave=0;
     7     cin>>n;
     8     for(int i=0;i<n;i++){
     9         cin>>a[i];                    //读入数据的时候算出平均值 
    10         ave+=a[i]; 
    11     } 
    12     ave/=n;
    13     for(int i=0;i<n;i++){
    14         a[i]-=ave;                    //用每一项减去平均值,算出与最后结果相差多少 
    15     }
    16     for(int i=0;i<n;i++){
    17         if(a[i]!=0){
    18             a[i+1]=a[i]+a[i+1];        //只看眼前最优解,假设只是向右移动加 ,那么移动后a[i+1]值为原来的加前一个数 
    19             a[i]==0;                //如果移动后i位置上面为0达到目的 
    20             sum++;
    21         }else{
    22             continue;
    23         }
    24     } 
    25     cout<<sum<<endl;
    26     return 0;
    27 }
    
    
    
     
  • 相关阅读:
    iOS开发者程序许可协议
    IOS升级之 Objective-c新特性
    ios 性能优化之自动化UI测试
    ios 性能优化之CPU性能调优
    ios 性能优化之图形性能测试
    ios 性能优化之测试 iOS设备I/O活动
    ios 性能优化之定位应用程序的内存问题
    ios 性能优化之app运行时数据收集
    IOS8 理解应用程序扩展是如何工作的
    IOS8 创建一个应用程序扩展
  • 原文地址:https://www.cnblogs.com/ZKYAAA/p/12371700.html
Copyright © 2011-2022 走看看