题意:有n个班级,每个班级有a[i]个人,b[i]杯奶茶
每个人至多喝一杯奶茶,且不能喝自己班的
问能喝到奶茶的最多总人数
n<=1e6,a[i],b[i]<=1e9
思路:
做法一:
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 typedef unsigned int uint; 5 typedef unsigned long long ull; 6 typedef pair<int,int> PII; 7 typedef pair<ll,ll> Pll; 8 typedef vector<int> VI; 9 typedef vector<PII> VII; 10 //typedef pair<ll,ll>P; 11 #define N 1000010 12 #define M 200010 13 #define fi first 14 #define se second 15 #define MP make_pair 16 #define pb push_back 17 #define pi acos(-1) 18 #define mem(a,b) memset(a,b,sizeof(a)) 19 #define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++) 20 #define per(i,a,b) for(int i=(int)a;i>=(int)b;i--) 21 #define lowbit(x) x&(-x) 22 #define Rand (rand()*(1<<16)+rand()) 23 #define id(x) ((x)<=B?(x):m-n/(x)+1) 24 #define ls p<<1 25 #define rs p<<1|1 26 27 const int MOD=1e9+7,inv2=(MOD+1)/2; 28 double eps=1e-4; 29 int INF=1e9; 30 int inf=0x7fffffff; 31 int dx[4]={-1,1,0,0}; 32 int dy[4]={0,0,-1,1}; 33 34 ll a[N],b[N]; 35 36 ll read() 37 { 38 ll v=0,f=1; 39 char c=getchar(); 40 while(c<48||57<c) {if(c=='-') f=-1; c=getchar();} 41 while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar(); 42 return v*f; 43 } 44 45 void solve() 46 { 47 int n; 48 scanf("%d",&n); 49 ll s=0,ans=0; 50 rep(i,1,n) 51 { 52 a[i]=read(),b[i]=read(); 53 s+=b[i]; 54 } 55 rep(i,1,n) ans+=min(a[i],s-b[i]); 56 ans=min(ans,s); 57 printf("%I64d ",ans); 58 } 59 60 61 62 int main() 63 { 64 int cas=read(); 65 while(cas--) solve(); 66 return 0; 67 }
做法二:题解做法
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 typedef unsigned int uint; 5 typedef unsigned long long ull; 6 typedef pair<int,int> PII; 7 typedef pair<ll,ll> Pll; 8 typedef vector<int> VI; 9 typedef vector<PII> VII; 10 #define N 1100000 11 #define M 4100000 12 #define fi first 13 #define se second 14 #define MP make_pair 15 #define pi acos(-1) 16 #define mem(a,b) memset(a,b,sizeof(a)) 17 #define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++) 18 #define per(i,a,b) for(int i=(int)a;i>=(int)b;i--) 19 #define lowbit(x) x&(-x) 20 #define Rand (rand()*(1<<16)+rand()) 21 #define id(x) ((x)<=B?(x):m-n/(x)+1) 22 #define ls p<<1 23 #define rs p<<1|1 24 25 const ll MOD=1e9+7,inv2=(MOD+1)/2; 26 double eps=1e-6; 27 int INF=1e9; 28 29 30 int read() 31 { 32 int v=0,f=1; 33 char c=getchar(); 34 while(c<48||57<c) {if(c=='-') f=-1; c=getchar();} 35 while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar(); 36 return v*f; 37 } 38 39 int a[N],b[N]; 40 41 int main() 42 { 43 //freopen("1.in","r",stdin); 44 int cas; 45 scanf("%d",&cas); 46 while(cas--) 47 { 48 int n=read(); 49 ll sa=0,sb=0; 50 rep(i,1,n) 51 { 52 a[i]=read(); b[i]=read(); 53 sa+=a[i]; 54 sb+=b[i]; 55 } 56 if(sa>sb) 57 { 58 int flag=0,s=0; 59 rep(i,1,n) 60 if(a[i]+b[i]-(sa-sb)>sb) 61 { 62 flag=1; 63 s=a[i]+b[i]-(sa-sb)-sb; 64 } 65 if(flag) printf("%I64d ",sb-s); 66 else printf("%I64d ",sb); 67 } 68 else 69 { 70 int flag=0,s=0; 71 rep(i,1,n) 72 if(a[i]+b[i]-(sb-sa)>sa) 73 { 74 flag=1; 75 s=a[i]+b[i]-(sb-sa)-sa; 76 } 77 if(flag) printf("%I64d ",sa-s); 78 else printf("%I64d ",sa); 79 } 80 } 81 82 return 0; 83 }