Codeforces 321B Ciel and Duel

题意:对方有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

Codeforces 321B Ciel and Duel的相关文章

Codeforces 321B Ciel and Duel KM

题目链接 题意: 类似于游戏王的卡牌游戏,每个随从都有嘲讽... 输入n m 下面n行给出对手的随从当前状态和强壮值. 下面m行给出自己的随从的强壮值. 表示自己有m个随从,对手有n个随从.每个随从有一个强壮值. 现在是自己进攻的回合,自己的每个随从可以攻击一次(也可以不攻击) 若对手的随从都死光了,那么可以直接攻击玩家,造成与强壮值相等的伤害. 否则就要先攻击对手的随从. 对手的随从有防御状态(Defense) 和 攻击状态(Attack),每个随从也有一个强壮值. 1.若攻击对手的攻击状态随

Codeforces G. Ciel the Commander

题目描述: Ciel the Commander time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Now Fox Ciel becomes a commander of Tree Land. Tree Land, like its name said, has n cities connected by n?-?1 undire

网络流(费用流)CodeForces 321B:Ciel and Duel

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

CodeForces 321C Ciel the Commander

Ciel the Commander Time Limit: 1000ms Memory Limit: 262144KB This problem will be judged on CodeForces. Original ID: 321C64-bit integer IO format: %I64d      Java class name: (Any) Now Fox Ciel becomes a commander of Tree Land. Tree Land, like its na

Codeforces 321E Ciel and Gondolas

传送门:http://codeforces.com/problemset/problem/321/E [题解] 首先有一个$O(n^2k)$的dp. # include <stdio.h> # include <string.h> # include <iostream> # include <algorithm> // # include <bits/stdc++.h> using namespace std; typedef long lon

CodeForces 321A Ciel and Robot(数学模拟)

题目链接:http://codeforces.com/problemset/problem/321/A 题意:在一个二维平面中,開始时在(0,0)点,目标点是(a.b),问能不能通过反复操作题目中的指令,从原点移动到目标点. 分析:如果一次完毕全部的命令后.移动到了(xx,yy),而且从(Xi.Yi)反复操作k次指令到达目标点.则能够列出方程 Xi + k * xx = a && Yi + k * yy = b.然后解出k.推断k是否大于等于0就可以. #include <cstdi

Codeforces 321C Ciel the Commander 树分治裸题

题目链接 题意: 给定一棵树,要用字母A-Z 填到每个节点上 字母可以无限使用,但A至多只能用一次 目标:对于任意两个相同字母的节点,他们之间的路径上必须有至少一个节点的字母比他们小 例如:在两个C之间至少要有一个A 或者一个B 问: 输出填涂方案. 树分治即可,最多支持2^25个节点,不会无解. #include <iostream> #include <string> #include <vector> #include <cstring> #inclu

codeforces 321E Ciel and Gondolas 四边形不等式

题目大意:给定n个人,需要分k次过河,两个人i,j如果同乘一条船就会产生ai,j的代价,求最终代价的最小值 这个玩应显然满足四边形不等式(虽然我并不知道这个不等式是啥 然后就是决策单调(虽然我并不知道为何满足四边形不等式一定决策单调 然后就能分治做辣... 定义Solve(l,r,optl,optr)表示当前在处理区间[l,r],最优决策区间为[optl,optr] 然后我们用区间[optl,min(optr,mid?1)]的f值来更新f[mid],并记录最优决策点pos 那么[l,mid?1]

Codeforces 321A Ciel and Robot 枚举答案

题目链接 枚举机器人走的最后一步,用终点坐差后计算周期次数 trick:周期次数要>=0 #include <iostream> #include <string> #include <vector> #include <cstring> #include <cstdio> #include <map> #include <queue> #include <algorithm> #include <