努力ing
你浪费的今天是昨天死去的人所渴望的明天!!!

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;

}

posted on 2013-05-19 16:50  努力ing  阅读(211)  评论(0)    收藏  举报