CF:322D - Ciel and Duel 贪心 或者 DP 我用的贪心 。。难道sort跟qsort是不一样的么?
2013-07-12 19:55
573 查看
D. Ciel and Duel
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
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.
Input
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
Output an integer: the maximal damage Jiro can get.
Sample test(s)
input
output
input
output
input
output
Note
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表示对方所拥有的攻击卡的数目。 因为防御卡全部击破放在第一种情况,防御卡只击破几张是没有用处的。。所以就只有这两种情况了。
不过今天写的时候。。发现个很无语的问题。。如果高手能解答下就好了。
跟
这两种方法竟然是不等价的。。我很无语。。前面一种WA掉了。它竟然会把我B[1].st的大小变成0. 我真的不知道为什么。后来改成后面这种写法,就AC掉了。。
提供那组测试数据
最后。。附上代码:
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
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.
Input
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
Output an integer: the maximal damage Jiro can get.
Sample test(s)
input
2 3 ATK 2000 DEF 1700 2500 2500 2500
output
3000
input
3 4 ATK 10 ATK 100 ATK 1000 1 11 101 1001
output
992
input
2 4 DEF 0 ATK 0 0 0 1 1
output
1
Note
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
8001800180018001800180018001800180018001800180018001800180018001800180018001800180018001800180018001800180018001800180018001800180018001800180018001800180018001800180018001800180018001800180018001800180018001800180018001800180018001800180018001800180018001800180018001800180018001800180018001800180018001800180018001800180018001800180018001800180018001800180018001800180018001800180018001800180018001
最后。。附上代码:
/* * @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是不一样的么?
- CF321E Ciel and Gondolas 【决策单调性dp】
- Jzzhu and Chocolate - CF 449C 贪心
- Codeforces 322D Ciel and Duel【思维+费用流】
- 【贪心+简单题】-CF-388A-A fox and box accumulation
- Codeforces Round #288 (Div. 2) E. Arthur and Brackets [dp 贪心]
- HDU1069:Monkey and Banana(DP+贪心)
- CF 462D(Appleman and Tree-树形dp)
- Codeforces Round #353 (Div. 2) E. Trains and Statistic dp 贪心
- CF 518D(Ilya and Escalator-组合数太大,就直接拿去Dp)
- CF - 777C. Alyona and Spreadsheet 单调栈、dp
- CF 559C. Gerald and Giant Chess 组合数学+DP
- 【CF739B】Alyona and a tree(树上差分,二分,树形DP)
- CF 518 D. Ilya and Escalator 概率dp
- timus 1303. Minimal Coveragen URAL 解题报告 贪心或者DP
- HDU 1028 Ignatius and the Princess III(母函数 或者 整数划分的DP动态规划)
- 【CF908G】New Year and Original Order 数位DP
- CF618D:Hamiltonian Spanning Tree(贪心 & 树形dp & 最小路径覆盖)
- 【CF】D. Arthur and Walls(BFS + 贪心)
- CF 316 E. Pig and Palindromes 求左上角走到右下角是回文的方法数 DP