モンスターとの戦い(2018-2019 ACM-ICPC、中国マルチ省大学対抗プログラミングコンテスト)(2019年アジア銀川まずラウンドオンラインプログラミング)

ここはあなたに自分自身を紹介する私の大きな名誉です。私の名前はAloysius Benjy蜘蛛の巣Dartagnanエグバートフェリックス・ガスパルハンバートイグナチオジェイデンカスパーリロイマクシミリアンです。ストーリーテラーとして、今日私はあなたと他の人に英雄Huriyyah、モンスターについて話をすることにしました。

むかしむかし、市内の市民が苦しんれた  n個のn強力なモンスター。これらは単独で出て行っても無実の人々を殺害した小さな子供を食べました。ヒーローが登場する前に、不安は数十年のために人々を圧倒していました。

これらの不幸な市民の利益のため、Huriyyahはモンスターの主な隠れ家だったと戦った森にオフに設定し  、N、N激しいと残酷なモンスター。健康上の点  I i番目のモンスターであった  H P I HPI、その攻撃値であった  T K I ATKi。

彼らは、ターンベースの戦闘を通じて洞窟で戦いました。各秒の間に、英雄Huriyyahは、最初にモンスターに襲われ、ダメージはすべての生きているモンスターの攻撃値の合計でした。それから彼はモンスターを選択し、それを攻撃しました。モンスターのダメージ被る  のk K(その健康ポイントがによって減少する  k個のそれが下に来ていた攻撃の回だったK)。すなわち、各モンスターのために、と言うことです、Huriyyahはそれがあった攻撃は初めてのダメージ  1 1、このモンスターにHuriyyahの第二の攻撃のダメージとなった  2 2、このモンスターに3回目  3 3、というように。いくつかの時点で、モンスターの健康ポイントがゼロ以下だった場合、それが死亡しました。全てのモンスターを殺された場合にはヒーローが勝ちました。

彼は戦いに勝利する前に今、私のスマートな聴衆は、あなたが私たちの英雄が苦しむ必要があり、総被害の最小量を計算することができますか?

入力

入力は、いくつかのテストケースを含み、最初の行は、正の整数である  Tまでであるテストケースの数を示すT  10 3 103。

各テストケースのために、最初の行は、整数含ま  N 1 N 10 5  モンスターの数であるN(1≤n≤105を)。

I以下のi番目の行  のn n行は、2つの整数含ま  H P I HPI及び  A T KをI 1 H P I T K iは10 5   ATKi(1≤HPi、ATKi≤105)がモンスターを記述する。

我々は、の和ことを保証する  n個のすべてのテストケースにおけるnは最大で  10 6 106。

出力

各テストケースのために、出力を含む行  ケース#X:Y、  Xから始まるテストケース番号  1 1、及び  yは主人公が苦しむべき総損害の最小量です。

入力
コピー
2 
3
1 1
2 2
3 3
3
3 1
2 2
1 3
出力
コピー
ケース#1:19 
ケース#2:14


分析:最小ダメージが被った場合は、限り少しモンスターが最適なシーケンスを殺すよう最善を尽くすか、友人になることができますか?最高の要因は、時間を殺す少しモンスターであり、時間や損傷によって影響を受ける
   ので、私たちはソート判断の彼は最初のモンスターを殺すためにBまたはBが被った別のモンスターハイモンスター害を殺した後、モンスターを殺すを殺すときダメージの高い
PSは:そこのチームメイトは、ここにいくつかのアイデアを提供しないプライオリティキューを作ったいくつかの操作を行うことができます興味を持っています



書式#include <iostreamの> 
の#include <アルゴリズム> 
書式#include <cstdioを> 
する#include < 文字列 > 
の#include <CStringの> 
の#include <cstdlib> 
書式#include <マップ> 
書式#include <ベクトル> 
の#include < 設定 > 
書式#include <キュー> 
書式#include <スタック> 
の#include <cmath>
 使用して 名前空間はstdを、
#define PQ PRIORITY_QUEUE <整数>
 の#define PQL PRIORITY_QUEUE <LL>
 の#define pqn PRIORITY_QUEUE <ノード>
#define VLベクトル<LL>
 の#define LSONのRT << 1、L、M個  
 の#define rsonのRT << 1 | 1、M + 1、R用
 の#defineリード(X)のscanf( "%dの"、およびX)
 の#define LREAD(X)のscanf( "%のLLD"、&x)は、
#define PT(X)のprintf( "%d個の\ n"、(X))
 の#defineイエスのprintf( "YES \ n");
#defineなしのprintf( "NOの\ n");
#define GCD __gcd
 の#define CN CIN >>
 の#define CTはcout <<
 の#define編<< ENDL。
#defineし、[OK]リターン0;
#defineはcout <<てendlを超えます。
#define担当者(J、K)のための式(I = INT(INT)〜(j)は、iが=(INT)(k)を<。
入力(k)に対する(INT i = 1; iは=(INT <)(K); iは++){CIN >> [I]。}
 の#define MEM(S、T)のmemset(S、T、はsizeof(S))
 の#define戻り0再。
#define TLEのstd ::イオス:: sync_with_stdio(偽); cin.tie(NULL); cout.tie(NULL);
#define MOD(x)は、((X)%9973)
 の#define試験COUT << "++++++" << ENDL。
typedefの長い 長いLL。
const  int型 INT = 1E6 + 5 const  int型 MAXN = 10000 + 5 const  int型のlen = 1E5 + 5 

typedef 構造体ノード
{
    LLのX、Y、足首、T。
}ノード; 
// 二重getlen(ノードXX、ノードYY){戻りSQRT((xx.xの-yy.x)*(xx.xの-yy.x)+(xx.y-yy.y)*(xx.y- yy.y)); } // 计算两点间距离
ノードDP [LEN]。 
int型CMP(ノードA、ノードB)
{ 
  / *可以加可以不加
場合(*によって==のAY AT * BT) 戻り AY> によって、
  * /
リターンによってAY * BT> * aTを。 } int型ランタイム(INT NUM) { int型 = K 1、T = 0 一方、(NUM> 0 { T++ ; NUM - = K。 K ++ ; } 戻りT。 } int型のmain() { int型、T、N、K。 cinを >> トン。 INT KK = 1 ; KK <= T KK ++ { CIN >> N。 LL CNT = 0、和= 0 担当者(0、N- 1 { CIN >> DP [I] .X >> DP [I] .Y。 DP [i]は.T= ランタイム(DP [I] .X)。 CNT + = DP [I] .Y。 } ソート(DP、DP + N、CMP)。 担当者(0、N- 1 { 合計 + = CNT * DP [I] .T。 CNT - = DP [I] .Y。 } coutの << " ケース#" KK << << " " <<合計<< てendl; } OK。 }

 

おすすめ

転載: www.cnblogs.com/Shallow-dream/p/11440046.html