bzoj 1816: [Cqoi2010]扑克牌

Posted xiyuedong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj 1816: [Cqoi2010]扑克牌相关的知识,希望对你有一定的参考价值。

 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 int l,r,m,n,a[60],ans;
 5 bool pan(int x)
 6 {
 7     int a1=min(x,m);
 8     for(int i=1;i<=n;i++)
 9       if(a[i]<x)
10         {
11             a1-=x-a[i];
12             if(a1<0)
13               return 0;
14         }
15     return 1;
16 }
17 int main()
18 {
19     scanf("%d%d",&n,&m);
20     for(int i=1;i<=n;i++)
21       scanf("%d",&a[i]);
22     l=0;
23     r=1000000000;
24     for(;l<=r;)
25       {
26         int mid=(l+r)>>1;
27         if(pan(mid))
28           {
29             l=mid+1;
30             ans=mid;
31             }
32         else
33           r=mid-1;
34       }
35     printf("%d\n",ans);
36     return 0;
37 }

二分答案判断是否可行。

其实我还有一种想法,只是一直没对,以后要对拍一下。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 using namespace std;
 5 long long a[1000000],n,m,sum,q1=0x7ffffffffLL,q2=0x7ffffffffLL;
 6 bool f;
 7 int main()
 8 {
 9     scanf("%lld%lld",&n,&m);
10     for(int i=1;i<=n;i++)
11       scanf("%lld",&a[i]);
12     sort(a+1,a+n+1);
13     for(int i=2;i<=n;i++)
14       {
15         if(m-(i-1)*(a[i]-a[i-1])<0)
16           {                                                                                                                                                           
17             f=1;
18             q1=m/(i-1)+a[i-1];
19           }
20         m-=(i-1)*(a[i]-a[i-1]);
21         if(sum+(i-1)*(a[i]-a[i-1])>a[i])
22           {
23             f=1;
24             q2=(sum-(i-1)*a[i-1])/(2-i);
25           }
26         if(f)
27           break;
28         sum+=(i-1)*(a[i]-a[i-1]);
29       }
30     printf("%lld",min(a[n],min(q1,q2)));
31     return 0;
32 }

 

以上是关于bzoj 1816: [Cqoi2010]扑克牌的主要内容,如果未能解决你的问题,请参考以下文章

bzoj1816: [Cqoi2010]扑克牌(二分答案判断)

BZOJ1816[Cqoi2010]扑克牌 二分

bzoj1816: [Cqoi2010]扑克牌

bzoj1816[Cqoi2010]扑克牌 二分

[CQOI 2010]扑克牌

BZOJ 1816 扑克牌