2010年山東省第一屆ACM大學生程式設計競賽——Greatest Number
阿新 • • 發佈:2019-02-17
Greatest Number
題目意思:給你一串數,任取四個,可以重複,求最大值,但不能超過m。可以先將任意兩個數相加,然後再二分查詢求出符合題意的最大值即可。
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; typedef long long ll; ll a[1010]; ll num[1000010]; int bit_find(int l,int r,ll kk) { int mid; while(l<r) { mid=(l+r)>>1; if(num[mid]<kk) l=mid+1; else r=mid-1; } return l; } int main() { int n,t=1; ll m; while(scanf("%d%lld",&n,&m),n+m) { int i,j,k=0,x,p; ll ans=0; for(i=0;i<n;i++) scanf("%lld",&a[i]); for(i=0;i<n;i++) for(j=i;j<n;j++) if(a[i]+a[j]<=m) num[k++]=a[i]+a[j]; sort(num,num+k); for(i=0;i<k;i++) { ll kk=m-num[i]; p=bit_find(0,k-1,kk); if(num[p]+num[i]<=m) ans=max(ans,num[p]+num[i]); } if(t!=1) printf("\n"); printf("Case %d: %lld\n",t++,ans); } return 0; }