JZ高校OJ 3404 [NOIP2013シミュレーション]カードゲーム

説明

小型Xは、ゲームの彼らの優れたスキルを示すために、一日は喜んでカードゲームをプレイする小さなYを見つけます。各カードにはタイプ(攻撃や防御力)と2つの電力値の情報を持っています。

小さなカードY Nカード、小型カードXがmを有しています。Xは攻撃のすべての種類ある小さなカードを知られています。

小さなX操作して、ゲームの各ラウンドは、最初に彼の手Xからカードを使用しない]を選択します あなたは、Xの値のパワーにダメージを小さなYカードをお持ちでない場合は、それ以外の場合はYにはほとんどXは、小さな手からカードYを選択します (Xの値は、オプションのYパワーの値以上である場合にのみ電力)Yが攻撃されている場合、Yの現在のラウンドの終了後に消失し、Y小さな損傷がXとYの電力値の電力値との差である; Yなら防御タイプ(Xの値がY力値の選択よりも大きい場合のみ電力)が、Yの現在のラウンドの終了後、Yが小さい傷つけない消えました。

Xは、任意の時点で(カードが出て実行する必要はありません)彼の小さな運転を終了してもよいです。スマート希望あなたは彼が危険で被害総額小さなYように動作を助けます。
 

入力

入力の最初の行は二つの整数nとmを含有します。

次のn行小さなカードのY型(「ATK」が「DEF」が防御を表し攻撃を表す)と強度値のそれぞれの文字列と整数を含んでいます。

次のm行Xのカード値のパワーが小さい表す整数を含んでいます。

出力

出力線は、小さなY.が被った最大総ダメージを表す整数が含ま
 

サンプル入力

入力1:
2 3
ATK 2000
DEF 1700
2500
2500
2500

入力2:
3 4
ATK 10
ATK 100
ATK 1000年
1。
11。
101
1001
 

サンプル出力

出力は1:
3000
[1]サンプルは示して
最初のラウンド、彼らの最初のカードと小さなYの2枚目のカードを選択するための小さなXを、小さなYの2枚目のカードが消えます。
500損傷ながら第二ラウンド、小さなXは、彼らの2枚目のカードと最初のカードの小さなY、消え最初の小さなカードYを選択します。
第三ラウンド、小さなXは、小さなYの手は2500ダメージによって、何枚のカードを持っていない、彼らの3枚目のカードを選択します。
ゲームのX小端部、小さなY 3000は、ダメージを受けました。

出力2:
992は、
[2]サンプルが示し
損傷の91点であるが、それらの第三カード、最初のカードの小さなY、小さなカード消失する最初のYを選択するための第1ラウンド、小さなXを。
第二ラウンド、小さなXはダメージの901ポイントで同時に、自分のカードと第四小Yの2枚目のカード、小型カードYの二失踪を選択します。
992小さなYダメージの合計によってゲームのX小端部、。
 
 

データ制約

すべてのサイズの半分は小さなデータはYのみ攻撃カードを満足しています。

30データの%、1≤N、M≤6。

データの60%、1≤N、M≤10^ 3 。

データの100%、1≤N、M≤10^ 5に 、 電力値は負でない整数以上10 ^ 6です。
1つの#include <ビット/ STDC ++ H>
 2  の#define llの長い長い
 3  の#define ILインライン
 4  の#define RGIレジスタLL
 5  
6  使用して 名前空間STDを、
7  
8  のconst  int型 OO = 0x3f3f3f3f 9  CONST LL N = 100000 + 10 10  
11 LL N、M、ステップ、ANS、ミネソタ州= OO。
12  っDEF [N]、ATK [N]、X [N]。
13  LLのsum_def [N]、[N]をsum_atk、[N]をSUM_X。
14  
15  のIL LLリード()
 16 {
 17      RGI X = 0、F = 0 、CH。
18      しばらく | F = CH ==(isdigit(CH = getchar関数())!)' - ' ;
19      一方(isdigit(CH))X =(X << 1)+(X << 3)+(CH ^ 48)、CH = GETCHAR()。
20      リターン F?- X:X;
21  }
 22  
23  のint main()の
 24  {
 25      、M = read()は、N = )(読み取ります。
26      のために(RGI I = 1 ; I <= M + I)
 27     {
 28          チャー OP [ 10 ]。
29          LL valを、
30          のscanf(" %sの%のLLD "、OP、およびヴァル)。
31          であれば(OP [ 0 ] == ' A ' 32              ATK [++ ATK [ 0 ] = ヴァル。
33          他の 場合(OPが[ 0 ] == ' D ' 34              DEF [++ DEF [ 0 ] = ヴァル。
35      }
 36      (RGI I =1 ; I <= N。++ I)
 37          X [I] = (読み取り)
38      ソート(ATK + 1、ATK + ATK [ 0 ] + 1 )。
39      ソート(DEF + 1、DEF + DEF [ 0 ] + 1 )。
40      ソート(X + 1、X + N + 1 )。
41      のために(RGI I = 1 ; I <= ATK [ 0 ]; ++ I)
 42          sum_atk [I] = sum_atk [I - 1 ] + ATK [I]。
43      のために(RGI I = 1; I <= DEF [ 0 ]。++ I)
 44          sum_def [I] = sum_def [I - 1 ] + DEF [I]。
45      のために(RGI I = 1 ; I <= N; ++ I)
 46          SUM_X [I] = SUM_X [I - 1 ] + X [i]は、
47      ATK [ATK [ 0 ] + 1 ] = OO。
48      のために(RGI I = 1 ; I <= N; ++ I)
 49      {
 50          ながら(X [I]> = ATK [ステップ])
 51              ステップ++ 52          step--;
53          ミネソタ州=分(ミネソタ州、ステップ+ N - I)。
54      }
 55      ANS = SUM_X [N] - SUM_X [N -ミネソタ州] - sum_atk [ミネソタ州]。
56      であれば(ミネソタ州> = ATK [ 0 ] && N> M)
 57      {
 58          ステップ= 1 59          のために(RGI I = 1 ; I <= DEF [ 0 ]; ++ I)
 60          {
 61              ながら(DEF [I]> = X [ステップ])
 62                  ステップ++ 63              X [ステップ] = 0 ;
64         }
 65          であれば(ステップ<= N - ミネソタ州)
 66              のための(RGI i = 1 ; iが<= N -ミネソタ州と、++ I)
 67の                  ANS + = X [i]は、
68      }
 69      (RGI I = 1 ; I <ミネソタ州; ++ I)
 70の          ANS = MAX(ANS、SUM_X [N] - SUM_X [N - 1] - sum_atk [I])。
71      のprintf(" %のLLD " 、ANS)。
72      リターン 0 ;
73 }

おすすめ

転載: www.cnblogs.com/anbujingying/p/11307968.html