Problem H

来源:互联网 发布:windows 10 mobile apk 编辑:程序博客网 时间:2024/06/10 20:06

Problem H

Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 85   Accepted Submission(s) : 5

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

Problem Description

在打游戏的时候,同时碰到多只野怪需要怎么样的攻击顺序攻击才能使所受到的总伤害最少呢?假设玩家的攻击力固定,野怪的攻击力也固定,不会存在暴击的情况,同时没有范围伤害一次只能攻击一只野怪,人物和野怪每秒只能攻击一次。野怪被打死了不能继续攻击,但是在被打死的最后一秒钟还是可以输出伤害的。现在告诉你玩家的攻击力,以及每只野怪的血量和攻击力。请你计算玩家最小承受伤害。输出玩家最小承受伤害以及攻击顺序。
ps:如果最小承受伤害有多种方案,那么输出编号字典顺最小的一组方案。

Input

输入第一个数t(t<=10)表示测试用例数。接下来每个用例第一行有两个整数p,n(n<=15),分别表示玩家攻击力和野怪的数目,然后跟着的n行每行有两个整数组成分别表示标号从1-n的野怪的血量和攻击力。

Output

对于每一个用例第一行是所受最小伤害数,接下来n行是攻击野怪的顺序。

Sample Input

25 34 69 613 46 432 32 413 315 6

Sample Output

48123882431
#include<cstdio>#include<iostream>#include<algorithm>#include<string>#include<cmath>#include<cstring>using namespace std;struct A{    int x,g,num;    double bz;}f[20];bool cmp(A p,A q){    if(p.bz==q.bz)        return q.num<p.num;    return p.bz>q.bz;}int main(){    int t;    scanf("%d",&t);    while(t--)    {        int n,m;        scanf("%d %d",&n,&m);        for(int i=0;i<m;i++)        {            scanf("%d %d",&f[i].x,&f[i].g);            f[i].num=i+1;            f[i].bz=f[i].g*1.0/f[i].x;        }        sort(f,f+m,cmp);        int sum=0,ans=0;        int s=0;        for(int i=0;i<m;i++)        {            s=s+(int)ceil(f[i].x*1.0/n);            sum+=s*f[i].g;        }        printf("%d\n",sum);        for(int i=0;i<m;i++)            printf("%d\n",f[i].num);    }    return 0;}