题目:
描述:
有N组学生,给出初始时每组中的学生个数,再给出每组学生人数的上界R和下界(L≤R),每次你可以在某组中选出一个学生把他安排到另外一组中,问最少要多少次才可以使NN组学生的人数都在[L,R]中。
输入格式:
第一行一个整数N,表示学生组数; n≤50
第二行N个整数,表示每组的学生个数;
第三行两个整数L,R,表示下界和上界。
输出格式:
一个数,表示最少的交换次数,如果不能满足题目条件输出-1
解析:
这道题
其实就是
将所有在圈外的
全部换到圈内
所以可以分为两个部分
部分1:
部分1
一般可以
再分为两个
先找到有多少人多余上限需要调走
再找到那些缺少人数的组需要多少人来补
所以最优的办法就是用那些多余的人来补那些缺少人数的组
再来判断一下
多出来的人多还是缺少的人多
它们中的最大值
就是答案
部分2:
第二个部分
则是判断有没有可能
完全不成功
所以就是判断
if(sum(所有组的总人数)>=n*r)
就这一句话
简简单单
下面是代码
代码:
#include<bits/stdc++.h>
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
int main()
{
int n,a[1001],l,r,sum=0,maxl=0,maxr=0;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
sum+=a[i];
}
cin>>l>>r;
for(int i=1;i<=n;i++)
{
if(a[i]<l) maxl+=l-a[i];
if(a[i]>r) maxr+=a[i]-r;
}
if(sum>n*r) cout<<"-1"<<endl;
else cout<<max(maxl,maxr);
return 0;
}

1076

被折叠的 条评论
为什么被折叠?



