hdu个人赛6—1009
来源:互联网 发布:github mac客户端下载 编辑:程序博客网 时间:2024/06/08 09:30
对抗女巫的魔法碎片
Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 0 Accepted Submission(s): 0
Problem Description
光明世界的一个国家发生动荡,女巫利用了邪恶的力量将国家的村庄都施下了咒语,好在国家还有英勇 的士兵,他们正义的力量能够破解这些魔咒夺回村庄,并且得到魔法碎片,利用足够多的魔法碎片可以将女巫铲除。
现在己经被魔咒封印的村庄有m个,编号为1到m。英勇的士兵n个,编号从1到n。第i个士兵攻击力 为ai ,第j个村庄防御力为bj ,魔法价值为cj 。
现在这些士兵想夺回这些村庄,每个士兵可以最多占领一个村庄,一个村庄最多被一个士兵占领。当士兵的攻击力ai 大于村庄的防御力bj 的时候,该士兵就可以夺回这个村庄,并且士兵会获得魔法碎片ai−bj+cj 个。
现在想知道这些士兵夺回村庄,获得的魔法碎片之和最多是多少
现在己经被魔咒封印的村庄有m个,编号为1到m。英勇的士兵n个,编号从1到n。第i个士兵攻击力 为
现在这些士兵想夺回这些村庄,每个士兵可以最多占领一个村庄,一个村庄最多被一个士兵占领。当士兵的攻击力
现在想知道这些士兵夺回村庄,获得的魔法碎片之和最多是多少
Input
输入第一行一个整数T,表示有T组数据。
接下来一行输入两个整数n和m。
接下来一行,输入n个数ai ,表示士兵的攻击力。
接下来m行,每行输入两个数bi,ci ,表示村庄的防御力和该村庄的魔法价值。
1 <= n,m <= 100000
1 <=ai,bi,ci <= 100000
接下来一行输入两个整数n和m。
接下来一行,输入n个数
接下来m行,每行输入两个数
1 <= n,m <= 100000
1 <=
Output
一个整数,表示获得的魔法碎片的数量
Sample Input
23 34 4 42 31 35 33 34 4 62 34 35 3
Sample Output
1110
【分析】
先说一下,这道题的题目是有问题的,在贪心的情况下,肯定是会优先选择村庄数量优先,也就是每次用最靠近村庄防御力的士兵去占领这个村庄,计算出能占领ans个村庄,然后最后从士兵攻击力从高到低取前ans个就可以了,村庄的贡献就是c[i]-b[i],按照贡献排序。
一组数据
1
2 2
2 10
1 3
9 3
贪心结果是8
正确答案应该是攻击10的士兵占领防御为1的村庄,答案为12
所以正确算法不是贪心....按照大佬讲的是如果你把所有按照a,b排序的话(a,b)放一起,那么就是找一个合法的括号序列使得价值最大,因此线段树贪心取出最大的()或者)(即可(需要满足取出之后合法)。
//这里留一个贪心的错误代码...虽然是AC的但是还是错误代码。。。陈老师的线段树模拟费用流...我不会写啊QAQ
【代码】
#include <cstdio>#include <iostream>#include <algorithm>#include <set>using namespace std; struct xx{ int x,y,c;}f[100010];int id[100010];int a[100010];bool cmp(const int&q,const int&w){ return f[q].c>f[w].c;}bool cmp1(const int&q,const int&w){ return q>w; }multiset<int>s;multiset<int>::iterator it;int main() { int pp;scanf("%d",&pp); while(pp--) { int n,m;scanf("%d%d",&n,&m); s.clear(); for(int i=0;i<n;i++) { scanf("%d",&a[i]); s.insert(a[i]); } sort(a,a+n,cmp1); for(int i=0;i<m;i++) { scanf("%d%d",&f[i].x,&f[i].y); f[i].c=f[i].y-f[i].x; id[i]=i; } sort(id,id+m,cmp); long long ans=0; int len=0; for(int i=0;i<m;i++) { it=s.lower_bound(f[id[i]].x); while (*it==f[id[i]].x)it++; if (it!=s.end()) { s.erase(it); ans+=f[id[i]].c; len++; } } //printf("%d\n",len); for(int i=0;i<n&&i<len;i++) ans+=a[i]; printf("%lld\n",ans); } return 0; }
阅读全文
0 0
- hdu个人赛6—1009
- hdu个人赛6—1009
- hdu个人赛6—1000
- hdu个人赛6—1003
- hdu个人赛6—1004
- hdu个人赛6—1007
- 第一场个人训练赛——A-ASCII码排序(HDU 2000)
- 第一场个人训练赛——B-计算两点间的距离(HDU 2001)
- 第一场个人训练赛——C-计算球体积(HDU 2002)
- 第一场个人训练赛——D-求绝对值(HDU 2003)
- 第一场个人训练赛——E-成绩转换(HDU 2004)
- 第一场个人训练赛——F-第几天?(HDU 2005)
- Another kind of Fibonacci (个人赛19 hdu 3306)
- 省赛选拔赛之个人赛(三)FZU 1026 |1050 +HDU 3466【思路题】
- HPU-ACM暑期培训第2周14级个人赛:Problem E HDU 4883
- 背包的个人整理 HDU HLG
- HDU 2665 个人理解(主席树)
- 校个人赛——02
- Codeforces Round #424 (Div. 2) D. Office Keys
- 练习题(队列)
- MyBatis 多对多完成版
- MyBatis多对多及一二级缓存
- PAT1019~~~
- hdu个人赛6—1009
- AngularJS小案例_简易音乐播放器
- 从github下载某个git库的4种方法
- 2.5总结
- codeforces 780-C. Andryusha and Colored Balloons(dfs)
- 百度陆奇内部最新演讲:成为优秀工程师的五个方法
- python核心高级学习总结2----------pdb的调试
- JAVA中集合类对比表
- HDU