Description
It is my great honour to introduce myself to you here. My name is Aloysius Benjy Cobweb Dartagnan Egbert Felix Gaspar Humbert Ignatius Jayden Kasper Leroy Maximilian. As a storyteller, today I decide to tell you and others a story about the hero Huriyyah, and the monsters.
Once upon a time, citizens in the city were suffering from n
powerful monsters. They ate small children who went out alone and even killed innocent persons. Before the hero appeared, the apprehension had overwhelmed the people for several decades.
For the good of these unfortunate citizens, Huriyyah set off to the forest which was the main lair of monsters and fought with n
fierce and cruel monsters. The health point of the i-th monster was HPi, and its attack value was ATKi
.
They fought in a cave through a turn-based battle. During each second, the hero Huriyyah was attacked by monsters at first, and the damage was the sum of attack values of all alive monsters. Then he selected a monster and attacked it. The monster would suffer the damage of k
(its health point would decrease by k) which was the times of attacks it had been came under. That is to say, for each monster, the damage of the first time that Huriyyah attacked it was 1, and the damage of Huriyyah's second attack to this monster was 2, the third time to this monster was 3
, and so on. If at some time, the health point of a monster was less than or equal to zero, it died. The hero won if all monsters were killed.
Now, my smart audience, can you calculate the minimum amount of total damages our hero should suffer before he won the battle?
Input
The input contains several test cases, and the first line is a positive integer T
indicating the number of test cases which is up to 103
.
For each test case, the first line contains an integers n (1≤n≤105)
which is the number of monsters.
The i
-th line of the following n lines contains two integers HPi and ATKi (1≤HPi,ATKi≤105)
which describe a monster.
We guarantee that the sum of n
in all test cases is up to 106
.
Output
For each test case, output a line containing Case #x: y, where x is the test case number starting from 1
, and y is the minimum amount of total damages the hero should suffer.
Sample Input
Input
2 3 1 1 2 2 3 3 3 3 1 2 2 1 3
Output
Case #1: 19 Case #2: 14
题意:一个人去打怪兽,每个怪物都有血量和攻击力,他攻击怪物一次,如果怪物按之前已经被攻击i次,那么怪物这次受到i+1点伤害,之后所有没有死的怪物全部攻击它一次,这么轮流(怪物先手),问英雄最少损失多少血量才能把所有英雄都消灭
思路:设一只怪物被攻击k次后死亡,按照怪物攻击力和k的比值排序,然后从大到小打怪物就好了
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<set>
#include<map>
#include<string>
#include<string.h>
#include<math.h>
#define maxn 150000
#define ll long long
#include<vector>
#include<queue>
using namespace std;
struct node
{
double x;
ll k,day;
} a[maxn];
bool cmp(node x,node y)
{
return x.x>y.x;
}
int main()
{
int t,cnt=0;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
ll al=0;
for(ll i=1; i<=n; i++)
{
ll x,y;
scanf("%lld %lld",&x,&y);
ll j,c=1LL;
for(j=1LL; c<x;)
{
j++;
c+=j;
}
al+=y;
a[i].day=j;
a[i].k=y;
a[i].x=(double)y/(double)j;
}
sort(a+1,a+1+n,cmp);
ll d=0,sum=0;
for(ll i=1; i<=n; i++)
{
sum+=a[i].day*al;
al-=a[i].k;
}
printf("Case #%d: %lld\n",++cnt,sum);
}
}