HDU 6667
题意
有n个班级,每个班级有ai个人,制作了bi杯奶茶。每个人都不能喝自己班制作的奶茶,且只能喝一杯奶茶,问最多有多少人喝到奶茶。
思路
但还有一种更巧妙的方式,就是直接把所有bi的值加起来,就是最多就这能喝这么多奶茶了,记做sum,然后我们就不考虑中间过程,每个班不考虑其他人到底喝了多少,只考虑自己最多能喝到多少奶茶,res+=min(a[i],sum-b[i]),但是这样的话最后可能有一些奶茶被重复利用了,就是相当于res>sum了,这样我们取个min就好了,然后当res<=sum的时候,说明奶茶没有被利用完或者刚好被利用完,这样答案就出来了,想一想,不考虑中间过程分配过程,直接考虑每个人除了自己之外能喝到的最多的奶茶,最后防止一些奶茶重复取个min。
AC代码(2246MS)
#include<bits/stdc++.h>
using namespace std;
const int man = 1e6+10;
int a[man],b[man];
int main(){
int t;scanf("%d",&t);
while(t--){
int n;scanf("%d",&n);
long long sum= 0;
for(int i = 1;i <= n;i++){
scanf("%d%d",a+i,b+i);
sum += b[i];
}
long long res = 0;
for(int i = 1;i <= n;i++){
res += min(1ll*a[i],sum-b[i]);//每个人能喝到除自己外最多的奶
}
printf("%lld\n",min(sum,res));//可能会有一部分奶被多个人喝,所以取个min。
}
return 0;
}