求助一道站外题
  • 板块学术版
  • 楼主Zhoumy小号
  • 当前回复0
  • 已保存回复0
  • 发布时间2020/12/6 11:48
  • 上次更新2023/11/5 06:32:15
查看原帖
求助一道站外题
356961
Zhoumy小号楼主2020/12/6 11:48
题目描述
	某单位陆续采购了N批相同的产品,并按到货的时间陆续堆积摆放在仓库中。由于每批产品的数量不一致,使得堆放后的 “外观” 差距非常大,数量多的则 “堆积如山” ,数量少的则 “小的可怜” 。

	小明是仓库管理员,绰号“强迫症”,他想设定一个数量标准,通过移动货物,使得最后每一堆货物都在这个标准之内,使它们“看起来差不多大小”。

	现给定N组货物各自的数量,给出小明的的数量标准[L,R],问最少要移动操作多少次(移动一件货物算1次)才可以使N堆货物的数量都在[L,R]中。

输入格式
	第一行一个整数N,表示货物的堆数。

	第二行N个用空格隔开的整数,表示每堆货物的数量。

	第三行两个整数L,R,表示小明设定的标准的下界和上界。

输出格式
	一个数,表示最少的操作次数,如果不能满足题目条件,则输出 -1 。

样例输入
2
10 20
10 15
样例输出
5
问题提示
N小于等于50 , L小于等于R , 其他数据在[1,1000000]中
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<stdio.h>
#include<queue>
#include<iomanip>
#include<string>
#include<cstdio>
using namespace std;
int n,a[55],l,r,mc,duo,shao;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		mc+=a[i]; 
	}
	cin>>l>>r;
	if(mc<l*n||mc>r*n)cout<<"-1";//判断无解情况 
	else{
		mc=0;
		for(int i=1;i<=n;i++){
			if(a[i]>r){//多了! 
				if(a[i]-shao<=r){//如果少的库存加上现有的不超过最大边界,就把库存给它而不动用移动新的 
					shao-=a[i]-r;
				}
				else{//反之把库存清为0,差的增加,动用l-a[i]个资源 
					duo+=a[i]-r-shao;
					shao=0;
					mc+=a[i]-r;
				}
			}
			else if(a[i]<l){//少了! 
				if(a[i]+duo>=l){//如果多的库存加上现有的超过最小边界,就把库存给它而不动用移动新的 
					duo-=l-a[i];//库存减少原有的和最左边要求的差
				} 
				else{//反之把库存清为0,差的增加,动用a[i]-r个资源 
					shao+=l-a[i]-duo;
					duo=0;
					mc+=l-a[i];
				}
			}
		}
		cout<<mc; 
	} 
	return 0;
}

本人代码 70分 求助

2020/12/6 11:48
加载中...