JZ 고등학교 OJ 3404 [NOIP2013 시뮬레이션] 카드 게임

기술

작은 X 게임의 자신의 뛰어난 능력을 보여주기 위해, 어느 날 행복하게 카드 게임을 작은 Y를 찾을 수 있습니다. 각 카드는 유형 (공격 또는 방어)와 두 개의 전원 값 정보가 있습니다.

작은 카드 Y의 N-카드, 소형 카드 X는 m이 있습니다. X는 공격의 모든 유형 작은 카드를 알려져 있습니다.

작은 X 운영하여 게임의 각 라운드는 먼저 그의 손 X.에서 사용하지 않는 카드를 선택 당신이 작은 Y 카드, X의 값의 능력에 손상을하지 않은 경우 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 2,000
수비력 1,700
2,500
2,500
2,500

입력 2
. 3. 4
ATK 10
ATK 100
ATK 1,000
. 1
. 11
101
1,001
 

샘플 출력

출력은 1 : 
3000
[1] 샘플 도시
첫번째 라운드 첫 카드 작은 Y의 제 2 카드를 선택할 수있는 작은 X를 작은 Y의 제 2 카드는 사라진다.
500 데미지하면서 두 번째 라운드 작은 X는 자신의 제 2 카드와 제 1 카드의 작은 Y 사라질 제의 Y 작은 카드를 선택한다.
세 번째 라운드, 작은 X는 작은 Y의 손에 2500 손상에 의해, 어떤 카드가없는, 그들의 제 3의 카드를 선택합니다.
게임의 X 작은 끝, 작은 Y 3000 손상 될 수 있었다.

출력 2 :
992
[2] 샘플이 도시
손상 91 포인트를하면서, 자신의 세번째 카드와 제 1 카드의 작은 Y, 작은 카드 사라질 제의 Y를 선택하는 제 라운드 작은 X를.
두 번째 라운드, 작은 X는 피해 901 점으로 같은 시간에, 자신의 카드와 네 번째 작은 Y의 두 번째 카드, 작은 카드 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 버리는 긴 길이
 3  #DEFINE IL 인라인
 4  #DEFINE RGI 레지스터 LL
 5  
6  이용한  스페이스 성병;
7  
8  CONST의  INT의 각종 = 0x3f3f3f3f ;
9  CONST LL N = 100000 + 10 ;
10  
11 LL의 N, m, 단계, ANS 미네소타 = OO;
12  줄게 DEF [N], 공격력 [N], X [N];
13  LL의 sum_def [N] sum_atk [N] sum_x [N];
(14)  
(15)  (IL)의 판독 LL ()
 16 {
 17      RGI X = 0 , F = 0 , CH;
18 일      동안 를 f | = CH == (isdigit에 (CH = getchar가 ())!) ' - ' ;
19 일      동안 (isdigit에 (CH2)) X = (X << 1 ) + (X << 3 ) + (CH ^ 48 ) = CH getchar가 ();
20      리턴 F? - X : X;
21  }
 22  
23  INT 주 ()
 24  {
 25      , M =) (읽기, N = ) (판독;
26       (RGI I = 1 ; I <= m ++ I)
 27     {
 28           OP [ 10 ];
29          LL의 발;
30          는 scanf ( " % S %의 LLD " , OP, 발);
31 일          경우 (OP [ 0 ] == ' ' )
 32              공격력 [++ 공격력 [ 0 ] = 브로;
(33) 그 밖의 경우 (OP [ 0 ] == ' D를 ' )
 34              DEF [++ DEF [ 0 ] = 브로;
35     }
 36  (= I RGI                1 ; 난 = <N; ++ I)
 37          X [I]가 = ) (판독;
38      정렬 (ATK + 1 , + 공격력 공격력 [ 0 ] + 1 );
39      정렬 (DEF + 1 , + DEF DEF [ 0 ] + 1 );
40      정렬 (X + 1 , X + N + 1 );
41       (RGI I = 1 ; I <= 공격력 [ 0 ] ++ I)
 42          sum_atk [I] = sum_atk [I - 1 ] + 공격력 [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      공격력 [공격력 [ 0 ] + 1 ] = OO;
48       (RGI I = 1 ; I <= N; ++ I)
 49      {
 50          동안 (X [I]> = 공격력 [공정])
 51              단계 ++ ;
52          step--;
53          미네소타 = 분 (미네소타 단계 + N - I);
54      }
 55      ANS sum_x = [N] - sum_x [N - 미네소타] - sum_atk [미네소타];
56      의 경우 (미네소타> = 공격력 [ 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 = 최대 (ANS, sum_x [N] - sum_x [N - I] - sum_atk [I]);
71      의 printf ( " %의 LLD " , ANS);
72      반환  0 ;
73 }

추천

출처www.cnblogs.com/anbujingying/p/11307968.html