題目描述
華華準備去上海世博會遊覽,但展館太多,而時間有限,因此他只能選擇遊覽一部分展館。在世博園區,假設華華想去的所有展館都在一條直道上,展館只有大、小兩類,參觀小展館需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;
}