5.9
洛谷P9050 [PA2021] Sumy
鱼的存活与否满足单调性,即,如果一条鱼能活下来,比它大的鱼一定都能活下来,如果一条鱼活不下来,比它小的一定都活不下来。
因此采用二分答案,转为判定问题。
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,ans[500010];
struct fish{
int w;
int id;
}q[500010];
bool cmp(fish a,fish b){
return a.w<b.w;
}
bool check(int x){
int cnt=0;
long long t=q[x].w; //t|max=10^9*5*10^5爆int了
for(int i=1;i<=n;i++){
if(i==x) continue;
if(t>q[i].w){
t+=q[i].w;
cnt++;
}
}
return cnt==n-1;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++){
cin>>q[i].w;
q[i].id=i;
}
sort(q+1,q+n+1,cmp);
int l=1,r=n+1; //l=1:最小的鱼一定活不到最后;
//r=n+1:如果所以鱼一样大,则都活不到最后
while(l+1<r){
int mid=(l+r)/2;
if(check(mid))
r=mid;
else
l=mid;
}
//输出处理
for(int i=r;i<=n;i++)
ans[q[i].id]=1;
for(int i=1;i<=n;i++)
cout<<(ans[i]? 'T':'N');
return 0;
}
check函数也可以这样写,更优:
bool check(int x){
long long t=q[x].w;
for(int i=1;i<=n;i++){
if(i==x) continue;
if(t<q[i].w)
return false;
t+=q[i].w;
}
return true;
}