Codeforces Round #190 (Div. 2).D
一道贪心题。
可以分两种情况
1 、是没有把对面的牌全打败,那么只要用最大的可能去打攻击状态的牌。
2、 是将对面的牌全打败,那么只要保证打对面防守状态的花费最小,就可以保证最后的结果最大
两种情况下的最大值就我们要的答案.
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 gets2500 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.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <map>
#include <queue>
#include <sstream>
#include <iostream>
using namespace std;
#define INF 0x3fffffff // 抗住! 一切都会好的! struct node
{
int key,id;
}g[]; int k[];
int def[],atk[]; int cmp(int t,int t1)
{
return t>t1;
} int main()
{
//freopen("//home//chen//Desktop//ACM//in.text","r",stdin);
//freopen("//home//chen//Desktop//ACM//out.text","w",stdout);
int n,m;
scanf("%d%d",&n,&m);
int cntd=,cnta=;
int sumd=,suma=;
for(int i=;i<n;i++)
{
string str;
int tmp;
cin>>str>>tmp;
if(str=="ATK")
{
suma+=tmp;
atk[cnta++]=tmp;
g[i].key=tmp;
g[i].id=;
}
else
{
sumd+=tmp;
def[cntd++]=tmp;
g[i].key=tmp;
g[i].id=;
}
}
int sum=;
for(int i=;i<m;i++)
{
cin>>k[i];
sum+=k[i];
}
int mx=-;
//求全攻击时的最大伤害
int tmp=;
sort(atk,atk+cnta);
sort(k,k+m,cmp);
int tend=min(m,cnta);
for(int i=;i<tend;i++)
{
if(k[i]>=atk[i])
{
tmp += k[i]-atk[i];
}
else break;
}
mx = max(mx,tmp); //////////////// 先判断 能不能把对面的全部清除掉
int flag[];
memset(flag,,sizeof(flag));
sort(k,k+m);
int sign=;
for(int i=;i<n;i++)
{
int flag1=;
for(int j=;j<m;j++)
{
if(flag[j]==) continue;
if(g[i].id==)
{
if(k[j]>=g[i].key)
{
flag1=;
flag[j]=;
break;
}
}
else
{
if(k[j]>g[i].key)
{
flag1=;
flag[j]=;
break;
}
}
}
if(flag1==)
{
sign=;
break;
}
}
if(sign==)
{
printf("%d\n",mx);
return ;
}
//////////////// 求将对面全清时的最大值
tmp = ;
memset(flag,,sizeof(flag));
sort(def,def+cntd);
for(int i=;i<cntd;i++)
{
for(int j=;j<m;j++)
{
if(flag[j]==) continue;
if(k[j] > def[i])
{
flag[j]=;
tmp+=k[j];
break;
}
}
}
printf("%d\n",max(sum-tmp-suma,mx)); // 大概就是这个意思
return ;
}
Codeforces Round #190 (Div. 2).D的更多相关文章
- Codeforces Round #190 (Div. 2) B. Ciel and Flowers
链接:http://codeforces.com/contest/322/problem/B 这题做错了.没考虑周全. #include <cstdio> #include <cst ...
- Codeforces Round #190 (Div. 2) E. Ciel the Commander 点分治
E. Ciel the Commander Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.codeforces.com/contest ...
- 树上的构造 树分治+树重心的性质 Codeforces Round #190 (Div. 2) E
http://codeforces.com/contest/322/problem/E E. Ciel the Commander time limit per test 1 second memor ...
- Codeforces Round #190 DIV.2 A. Ciel and Dancing
#include <cstdio> #include <iostream> #include <vector> using namespace std; int m ...
- Codeforces Round 190 div.2 322C 321A Ciel and Robot
唔...这题是数学题. 比赛时做出来,但题意理解错了,以为只要判断那点是不是在线上就行了,发现过不了样例就没提交. 思路:记录每一步的偏移,假设那点是在路径上的某步,然后回推出那一个周期的第一步,判断 ...
- Codeforces Round #190 (Div. 2) 水果俩水题
后天考试,今天做题,我真佩服自己... 这次又只A俩水题... orz各路神犇... 话说这次模拟题挺多... 半个多小时把前面俩水题做完,然后卡C,和往常一样,题目看懂做不出来... A: 算是模拟 ...
- [置顶] Codeforces Round #190 (Div. 2)(完全)
好久没有写博客了,一直找不到有意义的题可以写,这次也不算多么有意义,只是今天是比较空的一天,趁这个时候写一写. A. B. 有一点贪心,先把每个拿去3的倍数,余下0或1或2,然后三个一起拿. 对于以上 ...
- Codeforces Round #190 (Div. 1 + Div. 2)
A. Ciel and Dancing 模拟. B. Ciel and Flowers 混合类型的数量只能为0.1.2,否则3个可以分成各种类型各自合成. C. Ciel and Robot 考虑一组 ...
- Codeforces Round #366 (Div. 2) ABC
Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...
随机推荐
- SectionIndexer中的getSectionForPosition()与getPositionForSection()解惑
大家在做字母索引的时候常常会用到SectionIndexer这个类,里面有2个重要的方法 1. getSectionForPosition()通过该项的位置,获得所在分类组的索引号 2. ge ...
- Oracle开发者守则
下面为Oracle大师级语录: Oracle Database developers should follow is to do everything they can in SQL. What t ...
- 报错 System.ComponentModel.Win32Exception:拒绝访问,如何以管理员身份调试应用程序
打开程序集的属性窗口,找到“安全性”设置,其中有一个“启用 ClickOnce 安全性设置”,勾选后再反勾选该复选框. 此时在解决方案资源管理器中,就可以找到 app.manifest 文件,勾选“启 ...
- NB 命令安装需似机(无图型化安装)
[root@ok ~]# virt-install -v -n 09ng04 -r 512 --vcpus=4 --location=/home/ISO/CentOS-6.7-x86_64-bin-D ...
- Apple ID地区怎么改为美国?(转载)
Apple ID地区怎么改为美国?有时候我们想要去App Store中下载国外APP的话,就可以尝试将Apple ID地区改为美国,然后再打开App Store,就可以切换到美国应用市场,下载国外AP ...
- 解决在eclipse中配置Tomcat时,出现"Cannot create a server using the selected type"的错误
比如说使用tomcat 这是因为你之前创建过一次,比如说tomcat6,你指定的目录是:D:/tomcat-6.0.3 后来因为某种原因你把tomcat删了,然后你又安装到了E:/tomcat-6.0 ...
- jquery ajaxSubmit
<script type="text/javascript" src="jquery/jquery.js"></script></ ...
- Windows Phone 修改系统定义的资源颜色
[问题的背景] 相信有些经验的WP研发同学都会遇到下面的问题: 系统控件以及WPToolkit中大量使用了PhoneAccentBrush这个画刷(这个画刷定义的是系统的强调色,即用户选择的主题颜色) ...
- ADO.NET数据库应用开发_ExtendedProperties属性
7.5.5 ExtendedProperties属性 ExtendedProperties属性用来获取存储自定义属性的集合.可以在该属性中增加附加的存储信息.它的扩展属性必须是字符串类型.当以XML的 ...
- mysql client中使用帮助命令
当前MySQL服务器的版本号 使用那个命令来参看MySQL的帮助信息 帮助主题供我们查看. 命令为: ? contents 例如查看max方法的使用方法则输入? max即可 这个在navcat中是不支 ...