HOJ 3034 Mysterious (二分)
这道题比赛当时没做出来。后来听jingo讲了用二分,试了一下,过了。
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <memory.h> #define M 1000001 using namespace std; //对天数n进行二分 int menu[10001][51]; int days,dishes,budget; bool check(int mid,int dishes,int budget); int main() { int days,dishes,budget; while(cin>>days>>dishes>>budget) { memset(menu,0,sizeof(menu)); int res=0; // int flag=0; for(int i=0; i<days; i++) { for(int j=0; j<dishes; j++) { scanf("%d",&menu[i][j]); } } int high,low,mid; high=days; low=0; while(low<=high) { mid=(high+low)>>1; if(check(mid,dishes,budget)) { low=mid+1; res=mid; } else { high=mid-1; } } cout<<res<<endl; } return 0; } bool check(int mid,int dishes,int budget) { int sum[7]; memset(sum,M,sizeof(sum)); int res=0; for(int i=0; i<min(mid,7); i++) { for(int k=0; k<dishes; k++) { int temp=0; for(int j=i; j<mid; j+=7) { temp+=menu[j][k]; } sum[i]=sum[i]<temp?sum[i]:temp; //取花费最小的那种选择 } } for(int i=0; i<min(mid,7); i++) { res+=sum[i]; } return res<=budget; }