【HDOJ6667】Roundgod and Milk Tea(模拟)

题意:有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\n",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\n",sb-s);
66               else printf("%I64d\n",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\n",sa-s);
78               else printf("%I64d\n",sa);
79          }
80     }
81 
82     return 0;
83 }

猜你喜欢

转载自www.cnblogs.com/myx12345/p/11654748.html