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

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