The 2018 ACM-ICPC Chinese Collegiate Programming Contest Fight Against Monsters

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <string>
 5 #include <algorithm>
 6 #include <utility>
 7 #include <vector>
 8 #include <map>
 9 #include <queue>
10 #include <stack>
11 #include <cstdlib>
12 typedef long long ll;
13 #define lowbit(x) (x&(-x))
14 #define ls l,m,rt<<1
15 #define rs m+1,r,rt<<1|1
16 using namespace std;
17 int t,n;
18 const int  N=1e5+9;
19 struct Node{
20     int h;
21     ll w;
22     int f;
23 }node[N];
24 bool cmp(Node x,Node y){
25     double xx=1.0*x.f/x.w;
26     double yy=1.0*y.f/y.w;
27     return xx<yy;
28 }
29 /*
30 最好是先攻击 :被攻击次数越少,并且伤害力又大
31 也即是按照 
32 需要被攻击的次数/伤害力
33 由小到大排序
34 */
35 int  main()
36 {
37     scanf("%d",&t);
38     for(int i=1;i<=t;i++)
39     {  memset(node,0,sizeof(node));
40         scanf("%d",&n);
41          ll sum=0;
42         for(int i=0;i<n;i++){
43             scanf("%d%lld",&node[i].h,&node[i].w);    
44             sum+=node[i].w;
45         }
46         int k,ans;
47         for(int i=0;i<n;i++)
48         {   k=1;
49             ans=0;
50             while(node[i].h>0){
51                 node[i].h-=k;
52                 k++;
53                 ans++;
54             }
55             node[i].f=ans;
56         }
57         sort(node,node+n,cmp);
58         ll ret=0;    
59         for(int i=1;i<n;i++)
60             
61             {
62                 node[i].f=node[i-1].f+node[i].f;
63             }
64         for(int i=0;i<n;i++)
65         {
66             ret+=node[i].f*node[i].w;
67         }
68         printf("Case #%d: %lld
",i,ret);
69     }
70     return 0;
71 }
原文地址:https://www.cnblogs.com/tingtin/p/9327538.html