这道题比赛当时没做出来。后来听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;
}