CF:322D - Ciel and Duel 贪心 或者 DP 我用的贪心 。。难道sort跟qsort是不一样的么?
2 seconds
256 megabytes
standard input
standard output
Fox Ciel is playing a card game with her friend Jiro.
Jiro has n cards, each one has two attributes: position (Attack or Defense) and strength. Fox Ciel has m cards, each one has these two attributes too. It's known that position of all Ciel's cards is Attack.
Now is Ciel's battle phase, Ciel can do the following operation many times:
- Choose one of her cards X. This card mustn't be chosen before.
- If Jiro has no alive cards at that moment, he gets the damage equal to (X's strength). Otherwise, Ciel needs to choose one Jiro's alive card Y, then:
- If Y's position is Attack, then (X's strength) ≥ (Y's strength) must hold. After this attack, card Y dies, and Jiro gets the damage equal to (X's strength) - (Y's strength).
- If Y's position is Defense, then (X's strength) > (Y's strength) must hold. After this attack, card Y dies, but Jiro gets no damage.
Ciel can end her battle phase at any moment (so, she can use not all her cards). Help the Fox to calculate the maximal sum of damage Jiro can get.
The first line contains two integers n and m (1 ≤ n, m ≤ 100) — the number of cards Jiro and Ciel have.
Each of the next n lines contains a string position and an integer strength (0 ≤ strength ≤ 8000) — the position and strength of Jiro's current card. Position is the string "ATK" for attack, and the string "DEF" for defense.
Each of the next m lines contains an integer strength (0 ≤ strength ≤ 8000) — the strength of Ciel's current card.
Output an integer: the maximal damage Jiro can get.
2 3
ATK 2000
DEF 1700
2500
2500
2500
3000
3 4
ATK 10
ATK 100
ATK 1000
1
11
101
1001
992
2 4
DEF 0
ATK 0
0
0
1
1
1
In the first test case, Ciel has 3 cards with same strength. The best strategy is as follows. First she uses one of these 3 cards to attack "ATK 2000" card first, this attack destroys that card and Jiro gets 2500 - 2000 = 500 damage. Then she uses the second card to destroy the "DEF 1700" card. Jiro doesn't get damage that time. Now Jiro has no cards so she can use the third card to attack and Jiro gets 2500 damage. So the answer is 500 + 2500 = 3000.
In the second test case, she should use the "1001" card to attack the "ATK 100" card, then use the "101" card to attack the "ATK 10" card. Now Ciel still has cards but she can choose to end her battle phase. The total damage equals (1001 - 100) + (101 - 10) = 992.
In the third test case note that she can destroy the "ATK 0" card by a card with strength equal to 0, but she can't destroy a "DEF 0" card with that card.
那三个条件是。
防守卡需要数字大于它的才能击破,攻击卡需要数字大于等于它的才能击破,并能直接计算分数。如果对方没卡,直接扣血
所以思路就是分成2种情况,第一种是把对方卡全部击破,计算分数,第2种是选择击破1张,2张一直到natk张.。natk表示对方所拥有的攻击卡的数目。 因为防御卡全部击破放在第一种情况,防御卡只击破几张是没有用处的。。所以就只有这两种情况了。
不过今天写的时候。。发现个很无语的问题。。如果高手能解答下就好了。
bool cmd(struct node a,struct node b){
if((a.p>b.p)||(a.p==b.p&&a.st>b.st))
return false;
return true;
}
sort(B,B+n,cmd);
跟
int comp(const void *a,const void *b){
if(((struct node *)a)->p>((node *)b)->p
||((node *)a)->p==((node *)b)->p&&((node *)a)->st>((node *)b)->st)
return 1;
else return -1;
}
qsort(B,n,sizeof(B[0]),comp);
这两种方法竟然是不等价的。。我很无语。。前面一种WA掉了。它竟然会把我B[1].st的大小变成0. 我真的不知道为什么。后来改成后面这种写法,就AC掉了。。
提供那组测试数据
99 100
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
ATK 8000
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
8001
最后。。附上代码:
/*
* @author ipqhjjybj
* @date 20130712
*
*/
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
struct node{
int p,st; //p=0:Atack p=1,defense
}B[2000];
int A[2000];
int flag[2000];
bool cmd(struct node a,struct node b){
if((a.p>b.p)||(a.p==b.p&&a.st>b.st))
return false;
return true;
}
int comp(const void *a,const void *b){
if(((struct node *)a)->p>((node *)b)->p
||((node *)a)->p==((node *)b)->p&&((node *)a)->st>((node *)b)->st)
return 1;
else return -1;
}
int main(){
// freopen("322D.in","r",stdin);
int i,j;
int n,m,natk;
int ans;
char s[1000];
scanf("%d %d",&n,&m);
natk=0;
for(i = 0;i<n;i++){
scanf("%s %d",s,&B[i].st);
if(s[0]=='A') B[i].p=0,natk++;
else B[i].p=1;
}
for(i = 0;i<m;i++){
scanf("%d",&A[i]);
flag[i]=0;
}
sort(A,A+m);
//sort(B,B+n,cmd);
//我不知道为什么。。这样用是错的。。
qsort(B,n,sizeof(B[0]),comp);
ans = 0;
if(n<=m){ //看下能否全部摧毁
for(i=natk,j=0;i<n && j<m;i++){
while(A[j]<=B[i].st)
j++;
if(j<m){
flag[j++]=1;
}
}
if(j<m){
for(j=i=0;i<natk&&j<m;i++){
while(A[j]<B[i].st||flag[j])
j++;
if(j<m){
flag[j]=1;
ans+=A[j++]-B[i].st;
}
}
if(j<m)
for(j=0;j<m;j++)
if(!flag[j]){
ans+=A[j];
}
} }
//部分摧毁
int temp,k;
for(k=1;k<=natk && k<=m && k <=n;k++){
temp = 0;
for(i=k-1,j=m-1;B[i].st<=A[j] && i>=0;i--,j--)
temp+=A[j]-B[i].st;
if(i<0)
ans=max(ans,temp);
}
printf("%d\n",ans);
return 0;
}
CF:322D - Ciel and Duel 贪心 或者 DP 我用的贪心 。。难道sort跟qsort是不一样的么?的更多相关文章
- CF 321B Ciel and Duel(费用流)
题目链接:http://codeforces.com/problemset/problem/321/B 题意:两个人,分别有n.m张牌.每张牌有两个属性类型和能力,类型为攻击或者防守.B的m张牌的属性 ...
- 贪心/构造/DP 杂题选做Ⅱ
由于换了台电脑,而我的贪心 & 构造能力依然很拉跨,所以决定再开一个坑( 前传: 贪心/构造/DP 杂题选做 u1s1 我预感还有Ⅲ(欸,这不是我在多项式Ⅱ中说过的原话吗) 24. P5912 ...
- ALGO-13_蓝桥杯_算法训练_拦截导弹(贪心,DP)
问题描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...
- 【bzoj4922】[Lydsy六月月赛]Karp-de-Chant Number 贪心+背包dp
题目描述 给出 $n$ 个括号序列,从中选出任意个并将它们按照任意顺序连接起来,求以这种方式得到匹配括号序列的最大长度. 输入 第一行包含一个正整数n(1<=n<=300),表示括号序列的 ...
- 【贪心优化dp决策】bzoj1571: [Usaco2009 Open]滑雪课Ski
还有贪心优化dp决策的操作…… Description Farmer John 想要带着 Bessie 一起在科罗拉多州一起滑雪.很不幸,Bessie滑雪技术并不精湛. Bessie了解到,在滑雪场里 ...
- bzoj 1907: 树的路径覆盖【贪心+树形dp】
我是在在做网络流最小路径覆盖的时候找到这道题的 然后发现是个贪心+树形dp \( f[i] \)表示在\( i \)为根的子树中最少有几条链,\( v[i] \) 表示在\( i \)为根的子树中\( ...
- 贪心/构造/DP 杂题选做Ⅲ
颓!颓!颓!(bushi 前传: 贪心/构造/DP 杂题选做 贪心/构造/DP 杂题选做Ⅱ 51. CF758E Broken Tree 讲个笑话,这道题是 11.3 模拟赛的 T2,模拟赛里那道题的 ...
- 贪心/构造/DP 杂题选做
本博客将会收录一些贪心/构造的我认为较有价值的题目,这样可以有效的避免日后碰到 P7115 或者 P7915 这样的题就束手无策进而垫底的情况/dk 某些题目虽然跟贪心关系不大,但是在 CF 上有个 ...
- Moving Tables(贪心或Dp POJ1083)
Moving Tables Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 28304 Accepted: 9446 De ...
随机推荐
- UVA 1659 Help Little Laura 帮助小劳拉 (最小费用流,最小循环流)
(同时也是HDU 2982,UVA的数据多) 题意:平面上有m条有向线段连接了n个点.你从某个点出发顺着有向线段行走,给走过的每条线段涂一种不同的颜色,最后回到起点.你可以多次行走,给多个回路涂色(要 ...
- Linux编译安装Darwin Streaming Server 6.0.3
买回来VPS后就一直想在上面搭建一个流媒体服务,在网上搜索了很多资料,大部分都是介绍Linux中安装Darwin Streaming Server 5.5.5版本,因为这个版本提供了针对linux的安 ...
- java 访问器方法中对象引用的问题
"注意不要编写返回引用可变对象的访问器方法".因为会破坏类的封装性,引用的内容可能会被改变,产生业务逻辑上的错误. 什么是可变对象? 先要搞清楚java中值传递和引用传递的问题,总结如下: 1.对象就 ...
- 获取某月第一天,最后一天的sql server脚本 【转】http://blog.csdn.net/chaoowang/article/details/9167969
这是计算一个月第一天的SQL 脚本: SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) --当月的第一天 SELECT DATEADD(mm, DA ...
- table中嵌套table,如何用jquery来控制奇偶行颜色
总是要趁着自己还有记忆的时候,把该记录下来的都记录下来,着实是不敢恭维自己的记性. 相信很多时候,我们前端人员,经常会用到table里面的某个td中还嵌套着table,而这个时候还总要去弄奇偶行的颜色 ...
- android学习—— context 和 getApplicationContext()
一直看到好多应用里面,随手使用getApplicationContext(),不想说也不乐意说,今天转载一篇文章区分两者的区别: 在android中常常会遇到与context有关的内容 浅论一下con ...
- GCC 编译优化指南
转自: http://www.jinbuguo.com/linux/optimize_guide.html GCC 编译优化指南 作者:金步国[www.jinbuguo.com] 版权声明 本文作者是 ...
- Metaspace 之二--Java 8的元空间(metaspace)、metaspace监控方法
很多开发者都在其系统中见过“java.lang.OutOfMemoryError: PermGen space”这一问题.这往往是由类加载器相关的内存泄漏以及新类加载器的创建导致的,通常出现于代码热部 ...
- 软件测试技术(二)——使用等价类划分的方法进行的UI测试
测试的目标程序 程序代码 import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; impo ...
- Javascript手记-执行环境和作用域
执行环境是javascript一个重要的概念,执行环境定义了变量有权访问其他数据决定了他们各自的行为,每个执行环境 都有一个与之关联的变量,环境中定义的所有变量和函数都保存在这个对象中,虽然我们编写的 ...