[贪心 二分] 2016 计蒜之道 复赛 B. 联想专卖店大促销

来源:互联网 发布:软件开发哪里学 编辑:程序博客网 时间:2024/04/27 23:54

注意相邻不能相同 意味着最大的不超过其余两个的和+1

可以发现 三个礼包的交集是1个a 1个b 

剩余分别对应1个a 1个b 1个c

那么我们二分 是否x+y+z>=mid

然后验证


#include<cstdio>#include<cstdlib>#include<algorithm>using namespace std;inline char nc(){  static char buf[100000],*p1=buf,*p2=buf;  if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; }  return *p1++;}inline void read(int &x){  char c=nc(),b=1;  for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;  for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;}int A,B,C;int tem[5];inline bool check(int mid){  tem[1]=min(A-mid,mid);  tem[2]=min(B-mid,mid);  tem[3]=min(C,mid);  sort(tem+1,tem+4);  return tem[1]+tem[2]+min(tem[1]+tem[2]+1,tem[3])>=mid;  }int main(){  int T;  freopen("t.in","r",stdin);  freopen("t.out","w",stdout);  read(T);  while (T--){    read(A); read(B); read(C);    int L=0,R=B+1,MID;    while (L+1<R)      if (check(MID=(L+R)>>1))L=MID;      elseR=MID;    printf("%d\n",L);  }  return 0;}


0 0
原创粉丝点击