题目描述
华华准备去上海世博会游览,但展馆太多,而时间有限,因此他只能选择游览一部分展馆。在世博园区,假设华华想去的所有展馆都在一条直道上,展馆只有大、小两类,参观小展馆需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;
}