【每日一题】tokitsukaze and Soldier 题解

tokitsukaze and Soldier

https://ac.nowcoder.com/acm/problem/50439

Solution

非常显然的离线+优先队列求解,先处理更加“宽容”的人(希望士兵团不超过的人数更多的人),那么那些不那么“宽容”的被分配到团中时,比这个人更加“宽容”的人也能分配到团中。

限定一个值,让都堆在一起后,选择前大的求和即是此时所能安排的最大值。这是经典的topK问题。

的取值有个,所以直接枚举的复杂度是的。但如果从大的开始安排的话,会发现枚举的元素是在原来的基础上增加而已。那么问题就变成了动态的topK问题了。复杂度变为了

他给的输入不是按照递减的顺序给的,那么排一下序就可以了。

Code

#include<bits/stdc++.h>
using namespace std;
int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  int n; cin >> n;
  priority_queue<int, vector<int>, greater<int>> q;
  vector<pair<int, int>> v(n);
  for(int i = 0; i < n; i++) {
    cin >> v[i].second >> v[i].first;
  }
  sort(v.begin(), v.end());
  reverse(v.begin(), v.end());
  long long sum = 0, ans = 0;
  for(int i = n, j = 0; i >= 1; i--) {
    while(j < n && v[j].first >= i) {
      q.push(v[j].second);
      sum += v[j].second;
      j++;
    }
    while(int(q.size()) > i) {
      sum -= q.top();
      q.pop();
    }
    ans = max(ans, sum);
  }
  cout << ans << '\n';
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-09 12:10
直接上图
牛客13578115...:改得一般,不值80
点赞 评论 收藏
分享
弦五Strings:他之所以会举报你代课是因为在这种人眼里正常上课就是正义代课就是邪恶,典型二极管思维,处理方法就是私下沟通,你就说你自己家里经济困难或者家里父母生病什么之类的,需要去打工挣钱,用尽孝的正义对冲他认为的上课的正义,他可能就妥协了。
我的实习日记
点赞 评论 收藏
分享
牛客刘北:如果暑期实习是27届的话,你要晚一年才会毕业,企业为什么会等你呢?要搞清时间逻辑呀!27届现在实习只能是在暑假实习,这是日常实习,不是暑期实习。所以多去投日常实习吧,暑期实习肯定不会要你的
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-11 11:22
怎么这么多逆天求职者,救救我救救我救救我😭
flmz_Kk:哈哈哈哈哈哈,这么多求职者,肯定有那一两个逆天的
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务