喝奶茶最大值(不能喝自己班级的)2019 Multi-University Training Contest 8--hdu杭电第8场(Roundgod and Milk Tea)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6667
题意:
有 n个班级,每个班级有a个人、b个奶茶,每个班的人不能喝自己的奶茶,只能喝别人班的奶茶,问你最多有多少人喝到奶茶。
思路:
明显一道贪心题:
n=3
3 4 min=3
4 2 min=2
4 2 min=2
首先根据min值从大到小排序(先消除大的更优),两个min值是肯定可以消掉一个的,ans+=min*2,而且消到最后最多只有一个a、b都不为0。
然后就是要先判一下最后一个能不能消去。
最后就是除了最后一个其他a、b的总和就可以加起来了,取个min,ans+=min 就可以了。
1 #define IOS ios_base::sync_with_stdio(0); cin.tie(0); 2 #include <cstdio>//sprintf islower isupper 3 #include <cstdlib>//malloc exit strcat itoa system("cls") 4 #include <iostream>//pair 5 #include <fstream> 6 #include <bitset> 7 //#include <map> 8 //#include<unordered_map> 9 #include <vector> 10 #include <stack> 11 #include <set> 12 #include <string.h>//strstr substr 13 #include <string> 14 #include <time.h>//srand(((unsigned)time(NULL))); Seed n=rand()%10 - 0~9; 15 #include <cmath> 16 #include <deque> 17 #include <queue>//priority_queue<int, vector<int>, greater<int> > q;//less 18 #include <vector>//emplace_back 19 //#include <math.h> 20 //#include <windows.h>//reverse(a,a+len);// ~ ! ~ ! floor 21 #include <algorithm>//sort + unique : sz=unique(b+1,b+n+1)-(b+1);+nth_element(first, nth, last, compare) 22 using namespace std;//next_permutation(a+1,a+1+n);//prev_permutation 23 #define fo(a,b,c) for(register int a=b;a<=c;++a) 24 #define fr(a,b,c) for(register int a=b;a>=c;--a) 25 #define mem(a,b) memset(a,b,sizeof(a)) 26 #define pr printf 27 #define sc scanf 28 #define ls rt<<1 29 #define rs rt<<1|1 30 void swapp(int &a,int &b); 31 double fabss(double a); 32 int maxx(int a,int b); 33 int minn(int a,int b); 34 int Del_bit_1(int n); 35 int lowbit(int n); 36 int abss(int a); 37 //const long long INF=(1LL<<60); 38 const double E=2.718281828; 39 const double PI=acos(-1.0); 40 const int inf=(1<<29); 41 const double ESP=1e-9; 42 const int mod=(int)1e9+7; 43 const int N=(int)1e6+10; 44 45 struct node 46 { 47 long long a,b; 48 long long mi; 49 friend bool operator<(node a,node b) 50 { 51 return a.mi<b.mi; 52 } 53 }P[N]; 54 55 int main() 56 { 57 // freopen("D:\\QQ DATA\\1659826587\\FileRecv\\hdu-multi2019-8 5个账号 - 复件\\data\\k.in","r",stdin); 58 int T; 59 sc("%d",&T); 60 while(T--) 61 { 62 int n; 63 sc("%d",&n); 64 fo(i,1,n) 65 { 66 sc("%lld%lld",&P[i].a,&P[i].b); 67 P[i].mi=min(P[i].a,P[i].b); 68 } 69 sort(P+1,P+1+n); 70 long long ans=0; 71 int pos=n; 72 for(int i=n-1;i>=1;--i) 73 { 74 long long temp=min(P[i].mi,P[pos].mi); 75 ans+=temp*2; 76 P[i].mi-=temp;P[i].a-=temp;P[i].b-=temp; 77 P[pos].mi-=temp;P[pos].a-=temp;P[pos].b-=temp; 78 if(P[i].mi) 79 pos=i; 80 } 81 sort(P+1,P+1+n); 82 struct node temp=P[n]; 83 long long x=0,y=0; 84 for(int i=1;i<=n-1;++i) 85 x+=P[i].a,y+=P[i].b; 86 if(x&&temp.b) 87 { 88 long long tt=min(x,temp.b); 89 ans+=tt; 90 x-=tt;temp.b-=tt; 91 } 92 if(y&&temp.a) 93 { 94 long long tt=min(y,temp.a); 95 ans+=tt; 96 y-=tt;temp.a-=tt; 97 } 98 long long xx=min(x,y); 99 ans+=xx; 100 x-=xx;y-=xx; 101 pr("%lld\n",ans); 102 } 103 // fclose(stdin); 104 return 0; 105 } 106 107 /**************************************************************************************/ 108 109 int maxx(int a,int b) 110 { 111 return a>b?a:b; 112 } 113 114 void swapp(int &a,int &b) 115 { 116 a^=b^=a^=b; 117 } 118 119 int lowbit(int n) 120 { 121 return n&(-n); 122 } 123 124 int Del_bit_1(int n) 125 { 126 return n&(n-1); 127 } 128 129 int abss(int a) 130 { 131 return a>0?a:-a; 132 } 133 134 double fabss(double a) 135 { 136 return a>0?a:-a; 137 } 138 139 int minn(int a,int b) 140 { 141 return a<b?a:b; 142 }