루오 구 P2672 판매원 (욕심, 시뮬레이션)


문제 해결 아이디어

첫 번째 :

 

내가 집에 선거를 위해, 그것은 가족 전에 I-1의 값을 선택하는 것이 분명하다, 우리는 선거법의 마지막을 고려할 필요가 없다. 하나 (문제 s의에서) 내가 큰 값을 선택하거나 최대의 S의 나머지 부분을 선택합니다.

우리는 값의 내림차순에 따라서 각각의 상황 (들 및 a) 여러 구조체에 있고, 그 다음 합 접두사 I와 정면 오래된 maxS [I]를 구한다 S, MAXA는 [i]는 제 i ... 가족 선택된 N의 최대 값, 즉 (S * 2 + a) 최대로 나타낸다.

각 I 요건, ANS는 [I]는

  • 내가 전에 가정의 최대 값을 선택
  • 가족의 나머지 부분을 추가하기 전에 I-1의 최대 값을 선택 홈 전 ... n은 집에 가장 큰 기여

최대 값, 즉,

ANS [I] = 최대 SUM ([I] + 2 * maxs [I], 합계 [I-1] + MAXA [I])).

두 번째 :

물론, 기록 ANS 답 있도록 단위의 ANS에게 내가 증가와 함께, 때마다 숫자를 추가.

모든 선택를 들어, 하나 개의 위치 멀리 주소는 이제 두 개의 경우로 나눌 수 있습니다 :

  • 최대치 이제 <주소를 선택하는 K, A [K]에 대한 응답의 기여
  • 선택 주소> 지금 가장 큰 기여를하는 K 답변하는 [K] + 2 *에 대한 대답의 기여 (들 [K] - 지금)

그래서 각각 최대 걸릴 수 있습니다.

여기에 두 개의 큰 스택과 함께보다 편리 달성했다.

Q1 점은 Q2는 이제 정확한 지점에 저장되어, 지금은 왼쪽에 저장됩니다.

오른쪽으로 업데이트 점은, 다음 팝업 Q2, Q1로 이동하면 지금 사이에있는 모든 점의 좌표를 추가 좌표 q2.top ()를, 그리고 지금 마지막으로 업데이트 된 값.

업데이트가 왼쪽 지점입니다, 그냥 팝 Q1이 Q2는 치료하지.

따라서, Q2는 각각의 촬영 시점에서, 지금보다 적은 좌표 점을 모두 배출하는 것이 필요하다.

AC 코드

1 #INCLUDE <iostream>
 2 #INCLUDE <알고리즘>
 3 #INCLUDE <cmath>
 4 #INCLUDE <cstdio>
 5  이용  스페이스 성병;
6  CONST의  INT의 maxn = 100005 ;
7  INT의 N, maxs [maxn] MAXA [maxn];
8  구조체 노드 {
 9      INT의 S, A;
10      부울  연산자 <( CONST 노드 XX) {
 11          리턴 A> xx.a;
12      }
 13  } maxn, X;
14  INT[maxn 요약하면;
15  INT 의 main ()
 16  {
 17      CIN >> N;
(18)      에 대한이 ( int로 I = 1 ; i가 N = <난 ++ ) {
 19          는 scanf ( " %의 D를 " , X [I] .S);
20      }
 21       ( int로 I = 1 난 ++; i가 N = < {)
 22          (scanf와 " %의 D를 " 및, X [I] .A);
23      }
 24      정렬 (X + 1 , X + N + 1 );
(25)     위한 ( int로 I = 1 ; i가 <= N; 내가 ++ ) {
 26          합 [I]을 합 = [I- 1 ] + X [I] .A;
27          maxs [I] = 최대 (maxs [I- 1 ], X [I] .S);
28      }
 29       ( int로 I = N; 나는> = 1 , 난 - ) {
 30          MAXA [I] = 최대 (MAXA [I + 1 , 2 * X [I] .S + X [I] .A);
31      }
 32       ( int로 I = 1 ; i가 N = <; 내가 ++ ) {
 33          의 printf ( " % D \ 없음" 맥스 SUM ([I] + 2 * maxs [I], 합계 [I- 1 ] + MAXA [I]))
 (34)      }
 (35)       0 ,
 36 }
첫 번째
1 #INCLUDE <iostream>
 2 #INCLUDE <cstdio>
 3 #INCLUDE <알고리즘>
 4 #INCLUDE <큐>
 5  이용  스페이스 성병;
6  CONST의  INT의 maxn = 100005 ;
7  INT N;
8   ANS;
9  구조체 노드 {
 10      INT S;
11      INT a 및
12      부울  연산자 <( CONST 노드 P) CONST {
 13          반환  2 *의 S + A <PS * 2+ PA 단계;
14      }
 15  } D [maxn]; 
16 priority_queue < INT > Q1;
17 priority_queue <노드> Q2; 
(18)  보이드 shuchu () {
 19      의 printf ( " % LLD \ 없음 " , ANS);
20  }
 21  INT 의 main () {
 22      CIN >> N;
(23)      에 대한이 ( int로 I = 1 난 ++; i가 N = < {)
 (24)          는 scanf ( " %의 D " , [I] .S d);
25      }
(26)      에 대한이 ( int로 I = 1 난 ++; i가 N = < {)
 (27)          는 scanf ( " %의 D ' , D [I]를 .A);
28      }
 29       ( int로 I = 1 난 ++; i가 N = < {)
 30          q2.push (d [I]);
31      }
 32      INT는 지금 = 0 ;
(33)      에 대한이 ( int로 I = 1 난 ++; i가 N = < {)
 34          노드 (D2)를;
35          의 경우 (! q2.empty ()) {
 36             D2 = q2.top ();
37              동안 (d2.s <지금 && q2.empty ()!) q2.pop (), D2 = q2.top ();
38          }
 39          의 경우 (q1.empty ()) {
 40              노드 D2 = q2.top ();
41              q2.pop ();
도 42는              지금 = d2.s 단계;
43              ANS d2.a + = + 2 * d2.s- 2 * 지금;
44              shuchu ();
(45)              계속 ;
(46)          }
 (47)          의 경우 (q2.empty ()) {
 48              INT D1 = q1.top ();
49             q1.pop ();
50              ANS + = D1;
51              shuchu ();
(52)              계속 ;
53          }
 54          INT D1 = q1.top ();
55          INT의 D22 = d2.a + 2 * d2.s- 2 * 지금;
56          의 경우 (D1> D22) {
 57              q1.pop ();
58              ANS + = D1;
59          } 다른을 {
 60              q2.pop ();
61              지금 = d2.s 단계;
62              ANS + =D22;
 63이다          }
 64          shuchu ();
 65      }
 66      반환  0 ,
 67 }
두 번째

// NOIP2015 인기 그룹 T4

추천

출처www.cnblogs.com/yinyuqin/p/11762167.html