zoukankan      html  css  js  c++  java
  • 贪心练习(二) 货物搬运

    题目描述

    天地无情人有情,一方有难八方支援!汶川大地震发生后,灾区最紧缺的是救灾帐篷,全国各地支援的帐篷正紧急向灾区运送。假设围绕纹川县有环行排列的n个救灾帐篷的存储点,每个存储点存有的帐篷数量分别是M1,M2,……,Mn,且S=M1+M2+……+Mn必为n的倍数。可以在任意一个存储点中取任意数量的帐篷搬运到相邻的存储点。
    现在需要找到一种搬运方法,搬运最少的帐篷使得每个存储点中的帐篷数目相同。
    例如:n=5,每个存储点帐篷的数量分别为17 9 14 16 4,我们进行如下搬运:
    (1)存储点①向存储点②搬运1个帐篷;
    (2)存储点①向存储点⑤搬运4个帐篷;
    (3)存储点③向存储点②搬运2个帐篷;
    (4)存储点④向存储点⑤搬运4个帐篷。
    搬运帐篷的总数是1+4+2+4=11,并且可以证明这是最佳搬运方法。

    输入

    第1行一个正整数n(n≤10000),表示有n个存储点;
    第2行n个整数(integer范围),表示n个存储点中帐篷数量。

    输出

    一个整数,表示最少搬运的帐篷数量。

    样例输入

    5
    17 9 14 16 4
    

    样例输出

    11
    
    这是一种类似于均分纸牌的变形,都是先求出平均值,利用数组进行移动,但是由于要求最小值,所以需要进行多次移动,直到找出最小值。

    #include <iostream>
    #include <cmath>
    using namespace std;
    int main(){
        long long A[20001];
        long long B[20001];
        int N;
        long long sum=0;
        long long cha=0,su=0;
        long long max=9223372036854775807;
        cin>>N;
        for(int i=0;i<N;i++){
            cin>>A[i];
            A[i+N]=A[i];
            sum+=A[i];
        }
        long long avg=sum/N;
        for(int i=0;i<N;i++){
            su=0;
            for(int j=i;j<N+i;j++) B[j-i+1]=A[j];
            for(int k=0;k<N;k++){
                if(B[k]!=avg){
                    cha=B[k]-avg;
                    B[k+1]+=cha;
                    B[k]=avg;
                    su+=abs(cha);
                }
            }
            if(su<max) max=su;
        }
        cout<<max<<endl;
        return 0;
    }
    

      

  • 相关阅读:
    Django学习笔记之model篇(二)
    Django学习笔记之model篇(一)
    Django学习笔记之auth系统
    rust中文论坛
    cookies和session总结
    golang 简书
    mac快捷键
    目前的缺点
    Phalcon notes
    Docker note
  • 原文地址:https://www.cnblogs.com/hahahameimingzi/p/5693199.html
Copyright © 2011-2022 走看看