1 条题解
-
0
自动搬运
来自洛谷,原作者为

ZepX_D
12.20搬运于
2025-08-24 22:44:56,当前版本为作者最后更新于2023-02-08 20:44:09,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
思路
一条鱼最优的情况肯定是要把能吃的都吃了,因为吃别的鱼能获得更大的收益,但每条鱼都枚举一遍 的复杂度肯定是过不了的,发现假如一条鱼能活到最后,那比它重的必然能活到最后,且比它轻的必然活不到最后,满足单调性,所以我们可以先排序后二分,每次模拟一遍看能否活到最后就行,复杂度 。
代码
#include <queue> #include <cstdio> #include <iostream> #include <algorithm> #define ll long long using namespace std; inline ll read() { ll x = 0;char ch = getchar(); while(!isdigit(ch)) ch = getchar(); while(isdigit(ch)) x = x*10+ch-48,ch = getchar(); return x; } struct fish { ll w,id; }a[500010]; int n; char ans[500010]; queue < ll > q; bool cmp(fish x,fish y) {return x.w < y.w;} bool check(int k) { while(!q.empty()) q.pop(); for (int i = 1;i <= n;i++) if (i != k) q.push(a[i].w); ll s = a[k].w; while (!q.empty()) { if (q.front() >= s) return 0; s += q.front();q.pop(); } return 1; } int main() { n = read(); for (int i = 1;i <= n;i++) a[i].w = read(),a[i].id = i; sort(a+1,a+n+1,cmp); int l = 1,r = n+1; while(l < r) { int mid = (l+r)>>1; if (check(mid)) r = mid; else l = mid+1; } if (l > n) for (int i = 1;i <= n;i++) putchar('N'); else { for (int i = 1;i <= n;i++) ans[a[i].id] = (a[i].w >= a[l].w?'T':'N'); for (int i = 1;i <= n;i++) printf("%c",ans[i]); } return 0; }
- 1
信息
- ID
- 8015
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者