SCUT 130:对抗女巫的魔法碎片(贪心)
130. 对抗女巫的魔法碎片
题目描述
光明世界的一个国家发生动荡,女巫利用了邪恶的力量将国家的村庄都施下了咒语,好在国家还有英勇的士兵,他们正义的力量能够破解这些魔咒夺回村庄,并且得到魔法碎片,利用足够多的魔法碎片可以将女巫铲除。
现在已经被魔咒封印的村庄有mm个,编号为11到mm。英勇的士兵nn个,编号从11到nn。第ii个士兵攻击力为a_iai,第jj个村庄防御力为b_jbj,魔法价值为c_ici。
现在这些士兵想夺回这些村庄,每个士兵可以最多占领一个村庄,一个村庄最多被一个士兵占领。当士兵的攻击力a_iai大于村庄的防御力b_jbj的时候,该士兵就可以夺回这个村庄,并且士兵会获得魔法碎片a_i - b_j + c_jai−bj+cj 个。
现在想知道这些士兵夺回村庄,获得的魔法碎片之和最多是多少。
输入格式
输入第一行一个整数TT,表示有TT组数据。
接下来一行输入两个整数nn和mm。
接下来一行,输入nn个数 a_iai,表示士兵的攻击力。
接下来mm行,每行输入两个数b_i,c_ibi,ci,表示村庄的防御力和该村庄的魔法价值。
1 \leq n, m \leq 1000001≤n,m≤100000
1 \leq a_i, b_i, c_i \leq 1000001≤ai,bi,ci≤100000
输出格式
一个整数,表示获得的魔法碎片的数量
样例数据
输入
2
3 3
4 4 4
2 3
1 3
5 3
3 3
4 4 6
2 3
4 3
5 3
输出
11
10 思路:贪心。首先因为能用更多的士兵去匹配更多的城堡更好,考虑如果当前有很多个士兵匹配一个城堡的情况,那么肯定是ai大的去匹配更好。
可以对a和b都从小到大排序,然后对于当前的士兵,将所有ai > bj的城堡都用cj - bj进入优先队列,然后对于这个士兵取堆顶,相当于当前士兵匹配堆顶这个城堡。
如果当前的士兵没找到城堡可以匹配,那么需要替换掉之前的士兵,即用更大的ai去匹配之前最小的ai对应的城堡,具体细节在代码中。
#include <bits/stdc++.h>
using namespace std;
#define N 100010
typedef long long LL;
struct node {
int b, c;
} p[N];
int a[N], ans[N];
bool flag[N];
priority_queue<int> que; bool cmp(const node &a, const node &b) {
if(a.b != b.b) return a.b < b.b;
return a.c > b.c;
} int main() {
int t; scanf("%d", &t);
while(t--) {
int n, m; scanf("%d%d", &n, &m);
memset(ans, , sizeof(ans));
memset(flag, , sizeof(flag));
while(!que.empty()) que.pop();
for(int i = ; i <= n; i++) scanf("%d", &a[i]);
for(int i = ; i <= m; i++) scanf("%d %d", &p[i].b, &p[i].c);
sort(p + , p + + m, cmp);
sort(a + , a + + n);
int now = , cancel = ;
for(int i = ; i <= n; i++) {
while(a[i] > p[now].b && now <= m) que.push(p[now].c - p[now].b), now++;
if(!que.empty()) {
int top = que.top(); que.pop();
flag[i] = ; ans[i] = a[i] + top;
} else {
while(!flag[cancel] && cancel < i) cancel++;
if(flag[cancel]) ans[i] = ans[cancel] - a[cancel] + a[i], flag[i] = , flag[cancel] = , ans[cancel++] = ;
// printf("else : %d %d\n", i, cancel);
}
}
LL res = ;
for(int i = ; i <= n; i++) {
// printf("%d : %d\n", i, ans[i]);
if(flag[i]) res += ans[i] > ? ans[i] : ;
}
printf("%lld\n", res);
}
return ;
} /*
2
3 3
4 4 4
2 3
1 3
5 3
3 3
4 4 6
2 3
4 3
5 3
Êä³ö 11
10
*/
SCUT 130:对抗女巫的魔法碎片(贪心)的更多相关文章
- Luogu P3619 魔法 【贪心/微扰证明】
题目描述 cjwssb知道是误会之后,跟你道了歉.你为了逗笑他,准备和他一起开始魔法.不过你的时间不多了,但是更惨的是你还需要完成n个魔法任务.假设你当前的时间为T,每个任务需要有一定的限制ti表示只 ...
- SCUT - 131 - 小P玩游戏II - 贪心 - 平衡树
https://scut.online/p/131 首先假如钦定了一群人去打怪兽,那么可以把主要的任务都丢给b最大的人去打,这样不会更差.然后考虑枚举这个b最大的人,其他人陪练.一开始就是ai+k*b ...
- 2017杭电ACM集训队单人排位赛 - 6
2017杭电ACM集训队单人排位赛 - 6 排名 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 59 1 X X 1 1 X X 0 1 ...
- [学习笔记]设计模式之Facade
写在前面 为方便读者,本文已添加至索引: 设计模式 学习笔记索引 Facade(外观)模式定义了一个高层接口,它能为子系统中的一组接口提供一个一致的界面,从而使得这一子系统更加容易使用.欢迎回到时の魔 ...
- CodeForces758D
D. Ability To Convert time limit per test:1 second memory limit per test:256 megabytes input:standar ...
- 玲珑杯1147 - 最后你还是AK了
1147 - 最后你还是AK了 Time Limit:5s Memory Limit:256MByte DESCRIPTION 今天HHHH遇到了一颗树,这个树有nn个点(nn为偶数),每条边都有一个 ...
- ascii码所有字符对照表(包含汉字和外国文字)
http://www.0xaa55.com/thread-398-1-1.html看到了0xaa55的这个帖子,想起了2年前我在51cto发的一个帖子http://down.51cto.com/dat ...
- ICPC Asia Nanning 2017 I. Rake It In (DFS+贪心 或 对抗搜索+Alpha-Beta剪枝)
题目链接:Rake It In 比赛链接:ICPC Asia Nanning 2017 Description The designers have come up with a new simple ...
- 【BZOJ1975】【SDOI2010】魔法猪学院(搜索,A*,贪心)
我已经沉迷于粘贴题目地址了... 题解 很显然的贪心呀, 就是一定是最短的若干条路径的长度 所以,不断拓展k短路就可以了 至于怎么用A* 评估函数f(x)=dis[x]+g[x] 其中,dis是到N号 ...
随机推荐
- 大数据_zookeeper环境搭建中的几个坑
文章目录 [] Zookeeper简介 关于zk的介绍, zk的paxos算法, 网上已经有各位大神在写了, 本文主要写我在搭建过程中的几个极有可能遇到的坑. Zookeeper部署中的坑 坑之一 E ...
- Android Widget 小工具(两) 使用configure
添加Widget在此之前需要做一些处理操作,可以使用 配置活动 在上一篇的实现基础上,加上配置活动(configure=activity).这时加入Widget时.会先打开一个Activity,进行配 ...
- 【C#】wpf添加gif动图支持
原文:[C#]wpf添加gif动图支持 1.nuget里下载XamlAnimatedGif包,然后安装. 2.添加XamlAnimatedGif包的命名空间:xmlns:gif="https ...
- Java中的逆变与协变 专题
结论先行: PECS总结: 要从泛型类取数据时,用extends: 协变 要往泛型类写数据时,用super: 逆变 既要取又要写,就不用通配符(即extends与super都不用) 不变 List&l ...
- Use Spring @Scheduled To Achieve Timing Task
Today I have a chance to use the @Scheduled to achieve a timing task.It is useful.Anyway,it was the ...
- Arch Linux 是个 针对 i686 优化的 Linux 发行版(通过可以轻松使用的二进制包系统 - pacman)
Arch Linux 是个 针对 i686 优化的 Linux 发行版(通过可以轻松使用的二进制包系统 - pacman)Arch 同时也拥有一个类似 ports 的包构建系统(Arch Build ...
- 将Imagelist里的图像复制到TCanvas上的指定区域
function Tdmd.Draw_Image_In_Rect(C:TCanvas;R:TRect;i:integer):boolean;var tr:TRect;begin if i< ...
- XML转义字符 如"&"
解析数据 XML 解析器通常情况下会处理XML文档中的所有文本. 当XML元素被解析的时候,XML元素内部的文本也会被解析,例如: <message>Hello Word!</mes ...
- hive数据倾斜的解决办法
数据倾斜是进行大数据计算时常见的问题.主要分为map端倾斜和reduce端倾斜,map端倾斜主要是因为输入文件大小不均匀导致,reduce端主要是partition不均匀导致. 在hive中遇到数据倾 ...
- spring cloud之eureka简介
最近线上的接口出了一些问题,有一些可能不是代码的问题,但是由于是测试和其他方面的同事爆出来的,所以感觉对接口的监控应该提上日程. 经过搜索发现,spring cloud的eureka就是专门做这方面工 ...