题意:对方有N张卡牌,每一张卡牌要么是攻击模式要么是防守模式,你有M张卡牌,都是攻击模式 ,每张卡牌都有一个值,你可以进行一下的任意操
1)如果对方牌都被你消灭了,那么你任选一张没有选过的牌是对方遭受牌值的攻击。
2)可以选择一张没有选过值为X的牌,攻击对方一张攻击模式值为Y 的牌 对对方造成(X-Y)的伤害并把牌消灭 X必须 大于等于Y
3)可以选择一张没有选过值为X的牌,攻击对方一张防守模式值为Y 的牌 对对方不造成伤害,把对方牌消灭. X必须大于Y
解题思路:暴力 + DP?
解题代码:
1 /************************************************************ 2 * Author : darkdream 3 * Email : [email protected] 4 * Last modified : 2015-03-31 11:10 5 * Filename : 321b.cpp 6 * Description : 7 * *********************************************************/ 8 // File Name: 321b.cpp 9 // Author: darkdream 10 // Created Time: 2015年03月31日 星期二 09时34分01秒 11 12 #include<vector> 13 #include<list> 14 #include<map> 15 #include<set> 16 #include<deque> 17 #include<stack> 18 #include<bitset> 19 #include<algorithm> 20 #include<functional> 21 #include<numeric> 22 #include<utility> 23 #include<sstream> 24 #include<iostream> 25 #include<iomanip> 26 #include<cstdio> 27 #include<cmath> 28 #include<cstdlib> 29 #include<cstring> 30 #include<ctime> 31 #define LL long long 32 33 using namespace std; 34 int n , m; 35 int atk[105]; 36 int atkn; 37 int def[105]; 38 int defn; 39 int matk[105]; 40 int tatk[105]; 41 int tatkn; 42 char str[100]; 43 int mx; 44 int solve(int k) 45 { 46 int ans = 0 ; 47 for(int i = 1;i<= k;i ++) 48 { 49 if(matk[i] >= atk[k-i+1]) 50 { 51 ans += matk[i] - atk[k-i+1]; 52 }else{ 53 return -1; 54 } 55 } 56 mx = max(mx,ans); 57 return ans; 58 } 59 int cmp(int a, int b) 60 { 61 return a > b; 62 } 63 multiset<int> num; 64 int main(){ 65 scanf("%d %d",&n,&m); 66 int ta; 67 for(int i = 1;i <= n;i ++) 68 { 69 scanf("%s",str); 70 scanf("%d",&ta); 71 72 if(str[0] == ‘D‘) 73 { 74 defn ++ ; 75 def[defn] = ta; 76 } 77 else{ 78 atkn ++ ; 79 atk[atkn] = ta; 80 } 81 } 82 for(int i = 1;i <= m;i ++) 83 { 84 scanf("%d",&matk[i]); 85 num.insert(matk[i]); 86 // printf("%d %d\n",m,num.size()); 87 } 88 sort(atk+1,atk+1+atkn); 89 sort(matk+1,matk+m+1,cmp); 90 for(int i = 1;i <= min(atkn,m); i++) 91 { 92 solve(i); 93 } 94 if(m > atkn + defn) 95 { 96 set<int>::iterator tt; 97 int ok = 1; 98 for(int i = 1;i <= defn; i ++) 99 { 100 tt = num.upper_bound(def[i]) ; 101 if(tt == num.end()) 102 { 103 ok = 0 ; 104 break; 105 }else{ 106 num.erase(tt); 107 } 108 } 109 if(ok == 1) 110 { 111 m = 0 ; 112 memset(matk,0,sizeof(matk)); 113 for(tt = num.begin();tt != num.end();tt ++) 114 { 115 m ++ ; 116 matk[m] = *tt; 117 } 118 sort(matk+1,matk+m+1,cmp); 119 int hehe = solve(atkn); 120 if(hehe != -1 ) 121 { 122 for(int i = atkn+1;i <= m;i ++) 123 { 124 hehe += matk[i]; 125 } 126 mx = max(hehe,mx); 127 } 128 } 129 } 130 printf("%d\n",mx); 131 return 0; 132 }
时间: 2024-11-08 13:05:27