HDU1574 RP问题

http://acm.hdu.edu.cn/showproblem.php?pid=1574

题目大意:

如果a>0并且当前rp值大于或等于b时,才有可能发生

如果a<0并且当前rp值小于或等于b是,才有可能发生

事件有可能不发生,有可能发生

分析:

以第三组数据为例:

3

-5 0 4

10 -5 -5

-5 5 10

初始化:

rp数组

INF

INF

……

……

INF

0

INF

……

……

INF

0       1                                 l=r=10000;                       20005

第一事件发生:

因为a<0;所以b+10000r之间都有可能发生,用for循环2

rp数组

INF

INF

……

4

……

0

INF

INF

……

INF

0       1                l=l+a=9995;      r=10000;       

 

第二事件发生:

因为a>0,所以在b+10000l之间都有可能发生,用for循环1

rp数组

  

……

-1

……

0

……

INF

……

 

                        l=9995           10000            r=r+a=10010

 

第三事件发生:

因为a<0;所以b+10000r之间都有可能发生,用for循环2

rp数组

 

 

INF

……

9

……

0

……

INF

  

        l=l+a=99990       9995            10000          r=10010

在用for循环3找出最大值9;    

代码:

#include<iostream>

using namespace std;

#define INF -999999999

#define size 20005

int rp[size];

int main()

{

int n,t,i,x,a,b,c;

int l,r;

cin>>t;

while(t--)

{

for(i=0;i<size;i++)

rp[i]=INF;

l=r=10000;

rp[l]=0;

 

cin>>n;

while(n--)

{

cin>>a>>b>>c;

if(a>0)

{

for(i=b+10000;i>=l;i--) //…………………………………………  1

{

if(rp[i]!=INF)

{

x=rp[i]+c;

rp[i+a]=rp[i+a]>x?rp[i+a]:x;

}

r+=a;

}

}

else

{

for(i=b+10000;i<=r;i++) //………………………………………  2

{

if(rp[i]!=INF)

{

x=rp[i]+c;

rp[i+a]=rp[i+a]>x?rp[i+a]:x;

}

}

l+=a;

}

}

int max=INF;

for(i=l;i<=r;i++){ //…………………………………………………… 3

if(rp[i]>max) max=rp[i];

}

cout<<max<<endl;

}

return 0;

}

转载于:https://www.cnblogs.com/wuyanjun/archive/2013/05/19/3086972.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值