题意:你起初有一支军队,有$k$个士兵,现在有$n$座城堡,你若想占领第$i$座城堡,至少得有$a[i]$个士兵才能占领$($占领后士兵不会减少$)$,占领了第$i$座城堡后,你将得到$b[i]$个士兵,然后你有两种方式防御你占领的城堡:

  • 在你占领第$i$个城堡后留下一个士兵防御第$i$个城堡
  • 有$m$个传送门,能从$u_{i}$传送到$v_{i}(u_{i}>v_{i})$,你可以在占领完第$u_{i}$座城堡后再派一个士兵去防御第$v_{i}$个城堡

如果你防御了第$i$座城堡,你能得到$c[i]$的成就值,现在问你,如果你能占领全部的城堡,你能获得的最大的成就值是多少,若不能占领全部的城堡, 输出$-1$。

思路:对于每一座城堡,如果它能在多个地方被防御,那么肯定选择最远能够被防御的地方,所以预处理出$to[i][j]$表示第$to[i][j]$个城堡最远能被防御的地方是第$i$个城堡,根据贪心的思想,我们对于城堡$i$,应该将城堡$i$能够到达的城堡$to[i][j]$全部进行防御,防御时按照成就值从高到低依次防御,当没有士兵进行防御时,如果当前需要防御的城堡的成就值大于你已经防御的城堡里面成就值的最小值,则应该放弃那个成就值最小的城堡,来防御当前的城堡,当发现自己的士兵不够占领某个城堡时,贪心放弃那些成就低的城堡,利用优先队列,每次放弃城堡时取出队头即可。

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <queue>
#include <vector> using namespace std; const int N = ; struct node {
int a, b, c;
}; int n, m, k, pos[N];
vector<int> to[N];
node p[N];
priority_queue< int, vector<int>, greater<int> > q; void init()
{
for (int i = ; i <= n; i++) pos[i] = i;
} bool cmp(int a, int b)
{
return p[a].c > p[b].c;
} int main()
{
scanf("%d%d%d", &n, &m, &k);
init();
for (int i = ; i <= n; i++)
scanf("%d%d%d", &p[i].a, &p[i].b, &p[i].c);
for (int i = ; i <= m; i++) {
int u, v;
scanf("%d%d", &u, &v);
pos[v] = max(pos[v], u);
}
for (int i = ; i <= n; i++) to[pos[i]].push_back(i);
for (int i = ; i <= n; i++) sort(to[i].begin(), to[i].end(), cmp);
int res = , flag = ;
for (int i = ; i <= n; i++) {
if (p[i].a > k) {
int dis = p[i].a - k;
if (dis > q.size()) {
flag = ; break;
}
while (dis--) {
int tp = q.top(); q.pop();
res -= tp, k++;
}
}
k += p[i].b;
for (int j = ; j < (int)to[i].size(); j++) {
int v = to[i][j];
if ( == p[v].c) continue;
if ( == k && !q.empty() && p[v].c > q.top()) {
int tp = q.top(); q.pop();
res -= tp, k++;
}
if (k > ) res += p[v].c, q.push(p[v].c), k--;
}
}
if ( == flag) printf("-1\n");
else printf("%d\n", res);
return ;
}

最新文章

  1. oracle11g 新特性 - rman自动备份控制文件延迟
  2. 请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符&quot;go&quot;时,第一个只出现一次的字符是&quot;g&quot;。当从该字符流中读出前六个字符“google&quot;时,第一个只出现一次的字符是&quot;l&quot;。
  3. 40 个顶级 jQuery 图片、内容滑块和幻灯片(转)
  4. (hdu)1257 最少拦截系统
  5. [原创]浅谈如何使用gcc开发NT核心驱动程序
  6. 使用JavaScript把页面上的表格导出为Excel文件
  7. shc加密shell脚本
  8. TL-WR703Nv1.7刷写openwrt固件
  9. Hibernat 原生SQL运行结果集处理方法
  10. 机器学习入门17 - 嵌套 (Embedding)
  11. CMDB资产管理系统开发【day25】:表结构设计2
  12. 第45节:Java当中的变量,面向对象
  13. 文件缓存tmpfs简单使用
  14. Unity3d如何profile模拟器
  15. mvn install package区别
  16. Vue Authentication And Route Handling Using Vue-router(详解)
  17. 大家来找茬:富连网今天中午抢购二手iPhone时网站无法访问的问题
  18. [转]Format a ui-grid grid column as currency
  19. SQL Server 表,记录 死锁解决办法
  20. ACE中TASK架构简介及简单应用

热门文章

  1. Object的rest和spread方法
  2. 使用python实现冒泡、选择、插入基础排序
  3. 普及C组第二题(8.5)
  4. 7-3 Path to Infinity(还没ac)
  5. 设置idea的快捷键组合 设置为默认
  6. Docker - 命令 - docker volume
  7. python在线测试代码及教程
  8. IDEA导入Git项目后无Git选项
  9. 理解Javascript的原型和原型链
  10. 负环--spfa