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;
}


你可能感兴趣的:(HOJ 3034 Mysterious (二分))