问题 I: 游览世博

题目描述

华华准备去上海世博会游览,但展馆太多,而时间有限,因此他只能选择游览一部分展馆。在世博园区,假设华华想去的所有展馆都在一条直道上,展馆只有大、小两类,参观小展馆需30分钟,参观大展馆要60分钟。已知:从起点到各展馆的时间及展馆的大小。请问:华华最多能够参观多少个展馆。

输入

n s(展馆个数n<=100,游览时间s为整数分钟)
n个整数(表示从起点到各展馆所需要的时间,以空格相隔)
n个整数(表示各展馆的大小,1为小展馆,2为大展馆,以空格相隔)

输出

华华能够参观的最多展馆数

样例输入

5 200
30 120 100 75 50
2 1 2 1 1

样例输出

3
(即:参观1、4、5号展馆,总共用时195分钟)

是贪心题 但是感觉没用好贪心策略

#include<bits/stdc++.h>
using namespace std;

struct room{
    int time;
    int size;
}r[200];
bool cmp(room a,room b){
    return a.time<b.time;
}
int main()
{
   int n,t;
   while(cin>>n>>t)
   {
       //读取 排序
        for(int i=1;i<=n;i++)
            cin>>r[i].time;
        for(int i=1;i<=n;i++)
            cin>>r[i].size;
        sort(r+1,r+n+1,cmp);

        //统计当前展馆大小类型
        int size1[200],size2[200];
        memset(size1,0,sizeof(size1));
        memset(size2,0,sizeof(size2));
        for(int i=1;i<=n;i++){
            if(r[i].size==1){
                size1[i]=size1[i-1]+1;
                size2[i]=size2[i-1];
            }
            else{
                size1[i]=size1[i-1];
                size2[i]=size2[i-1]+1;
            }
        }

        //历遍求最大
        int temp=0,maxn=0,sum=0;
        for(int i=1;i<=n;i++)
        {
            temp=t-r[i].time;
            if(temp-size1[i]*30<=0)
                sum=temp/30;
            else if(temp-size1[i]*30-size2[i]*60<=0)
                sum=size1[i]+(temp-size1[i]*30)/60;
            else
                sum=size1[i]+size2[i];
            maxn=max(maxn,sum);
        }
        cout<<maxn<<"\n";
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章