这道题不难,一些细节处理好了就可以了。
主要是把气球数大于自己的插入到set里面,每次更新最小的size就好了。
要注意数据要开long long,还有set里面数据的处理。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 3e5+5;
multiset<long long> ranks;
typedef pair<long long,long long> pii;
pii num[maxn];
bool cmp(pii a,pii b) {
return a.first > b.first;
}
int main() {
int n;
scanf("%d",&n);
long long s,e;
int cnt = 0;
scanf("%I64d%I64d",&s,&e);
for(int i = 0;i < n-1;i++) {
long long x,y;
scanf("%I64d%I64d",&x,&y);
num[cnt].first = x;
num[cnt].second = y;
cnt++;
}
sort(num,num+cnt,cmp);
int ans = maxn,i = 0;
while(1) {
while(num[i].first > s && i < cnt) {
ranks.insert(num[i].second - num[i].first + 1);
i++;
}
int tt = ranks.size();
if(tt < ans)
ans = tt;
if(tt == 0) break;
if(tt > 0) {
long long it = *ranks.begin(); //注意这里的写法,错了就RE~
//printf("%I64d\n",*it);
if(it > s) break;
else {
ranks.erase(ranks.begin());
s -= it;
}
}
}
if(ans == maxn) ans = 0;
printf("%d\n",ans+1);
}
错了很多的小地方,写的时候要细心点,思考全面点。
加油!