C++练习 | 二分练习
Codeforces 371C : Hamburgers
#include<bits/stdc++.h> using namespace std; char B='B',S='S',C='C'; string t; int nb,ns,nc,pb,ps,pc,len; long long r1; map<char,int> m; bool check(long long m1) { long long need=0; if(m1*m[B]>nb) need+=(m1*m[B]-nb)*pb; if(m1*m[S]>ns) need+=(m1*m[S]-ns)*ps; if(m1*m[C]>nc) need+=(m1*m[C]-nc)*pc; return need<=r1; } int main() { int num=0; cin>>t; len=t.length(); for(int i=0;i<len;i++) { m[t[i]]++; } cin>>nb>>ns>>nc>>pb>>ps>>pc>>r1; long long l=0,r=max(max(nb,ns),nc)+r1,mid; while(l<=r) { mid=(l+r)/2; if(check(mid)) { l=mid+1; } else r=mid-1; } cout<<r<<endl; return 0; }
样例
HDU 2141 : Can you find it?
签到题(艹)
样例
#include<bits/stdc++.h> using namespace std; int L,N,M,a[507],b[507],c[507],d[1000007],S,x,k; int check(int d1[],int c1[],int X) { int l=0,r=k-1,m; for(int i=0;i<M;i++) { if(d1[r]+c1[i]<X) continue; l=0; r=k-1; while(l<=r) { m=(l+r)/2; if(d1[m]+c1[i]==X) return 1; if(d1[m]+c1[i]<X) { l=m+1; } else { r=m-1; } } } return 0; } int main() { // freopen("1.in","r",stdin); int num=0; while(cin>>L>>N>>M) { num++; k=0; cout<<"Case "<<num<<":"<<endl; for(int i=0;i<L;i++) cin>>a[i]; for(int i=0;i<N;i++) cin>>b[i]; for(int i=0;i<M;i++) cin>>c[i]; sort(c,c+M); for(int i=0;i<L;i++) { for(int j=0;j<N;j++) { d[k]=a[i]+b[j]; k++; } } sort(d,d+k); cin>>S; while(S--) { cin>>x; int t=check(d,c,x); if(t) cout<<"YES"<<endl; else cout<<"NO"<<endl; } } return 0; }
主要思路是把前两个数组的元素两两相加后与第三个数组元素相加的时候使用二分法简化步骤