题目大意:
如果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+10000到r之间都有可能发生,用for循环2
rp数组
INF | INF | …… | 4 | …… | 0 | INF | INF | …… | INF |
0 1 l=l+a=9995; r=10000;
第二事件发生:
因为a>0,所以在b+10000到l之间都有可能发生,用for循环1
rp数组
…… | -1 | …… | 0 | …… | INF | …… |
l=9995 10000 r=r+a=10010
第三事件发生:
因为a<0;所以b+10000到r之间都有可能发生,用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;
}