链接:

https://codeforces.com/contest/1271/problem/D

题意:

You play a strategic video game (yeah, we ran out of good problem legends). In this game you control a large army, and your goal is to conquer n castles of your opponent.

Let's describe the game process in detail. Initially you control an army of k warriors. Your enemy controls n castles; to conquer the i-th castle, you need at least ai warriors (you are so good at this game that you don't lose any warriors while taking over a castle, so your army stays the same after the fight). After you take control over a castle, you recruit new warriors into your army — formally, after you capture the i-th castle, bi warriors join your army. Furthermore, after capturing a castle (or later) you can defend it: if you leave at least one warrior in a castle, this castle is considered defended. Each castle has an importance parameter ci, and your total score is the sum of importance values over all defended castles. There are two ways to defend a castle:

if you are currently in the castle i, you may leave one warrior to defend castle i;

there are m one-way portals connecting the castles. Each portal is characterised by two numbers of castles u and v (for each portal holds u>v). A portal can be used as follows: if you are currently in the castle u, you may send one warrior to defend castle v.

Obviously, when you order your warrior to defend some castle, he leaves your army.

You capture the castles in fixed order: you have to capture the first one, then the second one, and so on. After you capture the castle i (but only before capturing castle i+1) you may recruit new warriors from castle i, leave a warrior to defend castle i, and use any number of portals leading from castle i to other castles having smaller numbers. As soon as you capture the next castle, these actions for castle i won't be available to you.

If, during some moment in the game, you don't have enough warriors to capture the next castle, you lose. Your goal is to maximize the sum of importance values over all defended castles (note that you may hire new warriors in the last castle, defend it and use portals leading from it even after you capture it — your score will be calculated afterwards).

Can you determine an optimal strategy of capturing and defending the castles?

思路:

计算到每个城堡最少多少人,计算出每个位置可以派出去多少人。

记录每个点最右边的坐标,因为左边的人可以带到右边去用,所以往右边放是较优的。

这样就可以用一个堆来维护。

代码:

#include<bits/stdc++.h>
using namespace std; const int MAXN = 5e3+10; struct Node
{
int v, i;
bool operator < (const Node & rhs) const
{
return this->v < rhs.v;
}
}; priority_queue<Node> que;
int a[MAXN], b[MAXN], c[MAXN];
int need[MAXN], las[MAXN], use[MAXN];
int n, m, k; int main()
{
cin >> n >> m >> k;
for (int i = 1;i <= n;i++)
cin >> a[i] >> b[i] >> c[i], las[i] = i;
int u, v;
for (int i = 1;i <= m;i++)
{
cin >> u >> v;
las[v] = max(las[v], u);
}
need[n] = a[n];
for (int i = n-1;i >= 1;i--)
need[i] = max(a[i], need[i+1]-b[i]);
int sum = k;
for (int i = 1;i <= n;i++)
{
if (sum < a[i])
{
puts("-1");
return 0;
}
sum += b[i];
}
sum = k;
for (int i = 1;i <= n;i++)
{
use[i] = sum+b[i]-need[i+1];
sum = need[i+1];
que.push(Node{c[i], i});
}
int ans = 0;
while(!que.empty())
{
int val = que.top().v;
int x = que.top().i;
que.pop();
int y = las[x];
while(use[y] == 0 && y > 0)
y--;
if (y == 0)
continue;
use[y]--;
ans += val;
}
cout << ans << endl; return 0;
}

Codeforces Round #608 (Div. 2) D. Portals的更多相关文章

  1. Codeforces Round #608 (Div. 2) - D. Portals(贪心)

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

  2. Codeforces Round #608 (Div. 2) 题解

    目录 Codeforces Round #608 (Div. 2) 题解 前言 A. Suits 题意 做法 程序 B. Blocks 题意 做法 程序 C. Shawarma Tent 题意 做法 ...

  3. Codeforces Round #608 (Div. 2)

    传送门 A. Suits 签到. Code /* * Author: heyuhhh * Created Time: 2019/12/15 17:16:33 */ #include <iostr ...

  4. 【cf补题记录】Codeforces Round #608 (Div. 2)

    比赛传送门 再次改下写博客的格式,以锻炼自己码字能力 A. Suits 题意:有四种材料,第一套西装需要 \(a\).\(d\) 各一件,卖 \(e\) 块:第二套西装需要 \(b\).\(c\).\ ...

  5. Codeforces Round #608 (Div. 2) E. Common Number

    链接: https://codeforces.com/contest/1271/problem/E 题意: At first, let's define function f(x) as follow ...

  6. Codeforces Round #608 (Div. 2) E - Common Number (二分 思维 树结构)

  7. Codeforces Round #608 (Div. 2)D(贪心)

    #define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using namespace std; ],b[],c[]; int u,v; ...

  8. Codeforces Round #608 (Div. 2) E. Common Number (二分,构造)

    题意:对于一个数\(x\),有函数\(f(x)\),如果它是偶数,则\(x/=2\),否则\(x-=1\),不断重复这个过程,直到\(x-1\),我们记\(x\)到\(1\)的这个过程为\(path( ...

  9. Codeforces Round #564 (Div. 1)

    Codeforces Round #564 (Div. 1) A Nauuo and Cards 首先如果牌库中最后的牌是\(1,2,\cdots, k\),那么就模拟一下能不能每次打出第\(k+i\ ...

随机推荐

  1. Tensorflow实战第十课(RNN MNIST分类)

    设置RNN的参数 我们本节采用RNN来进行分类的训练(classifiction).会继续使用手写数据集MNIST. 让RNN从每张图片的第一行像素读到最后一行,然后进行分类判断.接下来我们导入MNI ...

  2. webdriervAPI(多窗口切换)

    两个方法 driver.current_window_handle 获取当前窗口句柄 driver.window_handles 获取所有窗口句柄 from selenium import webdr ...

  3. 1 基于梯度的攻击——FGSM

    FGSM原论文地址:https://arxiv.org/abs/1412.6572 1.FGSM的原理 FGSM的全称是Fast Gradient Sign Method(快速梯度下降法),在白盒环境 ...

  4. MessageBox显示位置

    假设存在2个窗口类CImDlg与CChatDlg,如果希望MessageBox跟随CChatDlg,方法是 CChatDlg *pDlg = xxx; pDlg->MessageBox();

  5. Jenkins中shell-script执行报错sh: line 2: npm: command not found

    <1>本地执行npm run build--正常 <2>查看环境变量--正常 [root@localhost bin]# echo $PATH /usr/local/node/ ...

  6. 小白基础Python重要的字符串详解String的内置方法

    String的内置方法: st='hello world  {name} is {age}'  {}  特殊内容需要识别format print(st.count('1')) 统计元素个数 print ...

  7. springMvc接受单个文件,多个文件,多组文件

    web端 <form id="iconForm" enctype="multipart/form-data"></form> JS:通过 ...

  8. luogu题解 P2212 【浇地Watering the Fields】

    题目链接: https://www.luogu.org/problemnew/show/P2212 思路: 一道最小生成树裸题(最近居然变得这么水了),但是因为我太蒻,搞了好久,不过借此加深了对最小生 ...

  9. java实现spark常用算子之intersection

    import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaRDD;import org.apache.spark.a ...

  10. todo 看看堆栈里的东西

    类变量,成员变量,静态方法里的变量.参数,成员方法里的变量,参数