目录
一、题目描述:
二、整体思路:
三、代码:
一、题目描述:
二、整体思路:
- 要在k分钟内拿最多的金牌,就意味着要参加尽可能多的项目,因此就要选择耗时(比赛时间和休息时间)最少的项目
- 先预处理数组,按升序把项目耗时排序,注意排序规则不能为优先选比赛时间少,比赛时间相同的休息时间小的项目。因为可能会出现比赛时间很小而休息时间最长的情况。所以排序规则应为按比赛时间+休息时间升序排序。
- 注意到样例里面存在最后一个比赛项目可以只满足比赛时间而不满足休息时间,此时小蓝比赛结束。
三、代码:
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=2e5+10;
ll arr_a[N];
ll arr_b[N];
pair<ll,ll> arr_pair[N];
int n,k;
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>arr_a[i];
}
for(int i=1;i<=n;i++){
cin>>arr_b[i];
arr_pair[i]=make_pair(arr_a[i],arr_b[i]);//可以用结构体优化
}
sort(arr_pair+1,arr_pair+1+n,[](pair<ll,ll> p1,pair<ll,ll> p2){
return (p1.first+p1.second)<(p2.first+p2.second);//按比赛时间+休息时间升序排列
});
ll ans;
for(int i=1;i<=n;i++){
if(k-arr_pair[i].first-arr_pair[i].second>=0){
ans++;
k-=(arr_pair[i].first+arr_pair[i].second);
}else if(k-arr_pair[i].first>=0){//最后一个比赛项目可以只满足比赛时间不满足休息时间
ans++;
break;
}
}
cout<<ans;
return 0;
}