百度之星-度度熊与邪恶大魔王

 度度熊与邪恶大魔王 Accepts: 3666  
Submissions: 22474  
Time Limit: 2000/1000 MS (Java/Others)  
Memory Limit: 32768/32768 K (Java/Others)  
Problem Description  
  
度度熊为了拯救可爱的公主,于是与邪恶大魔王战斗起来。  
  
邪恶大魔王的麾下有n个怪兽,每个怪兽有a[i]的生命值,以及b[i]的防御力。  
  
度度熊一共拥有m种攻击方式,第i种攻击方式,需要消耗k[i]的晶石,造成p[i]点伤害。  
  
当然,如果度度熊使用第i个技能打在第j个怪兽上面的话,会使得第j个怪兽的生命值减少p[i]-b[j],当然如果伤害小于防御,那么攻击就不会奏效。  
  
如果怪兽的生命值降为0或以下,那么怪兽就会被消灭。  
  
当然每个技能都可以使用无限次。  
  
请问度度熊最少携带多少晶石,就可以消灭所有的怪兽。  
Input  
  
本题包含若干组测试数据。  
  
第一行两个整数n,m,表示有n个怪兽,m种技能。  
  
接下来n行,每行两个整数,a[i],b[i],分别表示怪兽的生命值和防御力。  
  
再接下来m行,每行两个整数k[i]和p[i],分别表示技能的消耗晶石数目和技能的伤害值。  
  
数据范围:  
  
1<=n<=100000  
  
1<=m<=1000  
  
1<=a[i]<=1000  
  
0<=b[i]<=10  
  
0<=k[i]<=100000  
  
0<=p[i]<=1000  
Output  
  
对于每组测试数据,输出最小的晶石消耗数量,如果不能击败所有的怪兽,输出-1  
Sample Input  
  
1 2  
3 5  
7 10  
6 8  
1 2  
3 5  
10 7  
8 6  
  
Sample Output  
  
6  
18 

 

 1 #include<cstdio>  
 2 #include<cstdlib>  
 3 #include<algorithm>  
 4 #include<cstring>  
 5 using namespace std;  
 6 typedef long long ll;  
 7   
 8 inline char nc(){  
 9   static char buf[100000],*p1=buf,*p2=buf;  
10   return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;  
11 }  
12 inline bool read(int &x){  
13   char c=nc(),b=1;  
14   for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1; else if (c==EOF) return 0;  
15   for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b; return 1;  
16 }  
17   
18 const int N=100005;  
19   
20 int n,m;  
21 ll f[11][1005];  
22   
23 int k[N],p[N];  
24   
25 inline void DP(int b,ll *f){  
26   for (int i=1;i<=1000;i++) f[i]=1LL<<50;  
27   f[0]=0;  
28   for (int i=1;i<=m;i++)  
29     if (p[i]>b)  
30       for (int j=0;j<=1000;j++)  
31     f[min(j+p[i]-b,1000)]=min(f[min(j+p[i]-b,1000)],f[j]+k[i]);  
32   for (int i=1000-1;~i;i--)  
33     f[i]=min(f[i+1],f[i]);  
34 }  
35   
36 int a[N],b[N];  
37   
38 int main(){  
39   while (read(n) && read(m)){  
40     for (int i=1;i<=n;i++) read(a[i]),read(b[i]);  
41     for (int i=1;i<=m;i++) read(k[i]),read(p[i]);  
42     for (int i=0;i<=10;i++)  
43       DP(i,f[i]);  
44     ll Ans=0;  
45     for (int i=1;i<=n;i++)  
46       Ans+=f[b[i]][a[i]];  
47     if (Ans>=1LL<<50)  
48       printf("-1\n");  
49     else  
50       printf("%I64d\n",Ans);  
51   }  
52   return 0;  
53 } 

 

转载于:https://www.cnblogs.com/haha008/p/7299864.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值