uva 672 Gangsters

来源:互联网 发布:淘宝假货可以不退货吗 编辑:程序博客网 时间:2024/05/16 04:33

题意:就是有N个人,有一个P值和一个S值,然后商店有一个K值,当这个人来的时候如果K和S相等,则进去,则总P加上该人的P值,每秒K可以+1或者-1或者不变。

思路:先按时间排序。d[i]表示第i个人进来总P值最大是多少。则d[i] = max(d[j], d[j]+p[i]) (t[i]-t[j] >= abs(S[i]-S[j])) ,这里要注意的就是初始化一开始所有人设为-1,d[0]=0;如果有的人不能到的话是不能更新后面的值的,不然的话初始化直接为0的话。

则比如:

T 2 3

S 3 4

如果直接为0的话,d[1]就可以更新d[2],但实际情况是不行的。

#include<cstdio>#include<cstring>#include<algorithm>#define mem(name,value) memset(name,value,sizeof(name))#define FOR(i,n) for(int i=1;i<=n;i++)using namespace std;const int maxn = 100+10;struct People{    int t,p,s;    bool operator < (const People& rhs)const{        return t < rhs.t;    }}p[maxn];int d[maxn];int main(){    int T,n,k,t;    scanf("%d",&T);    while(T--){        mem(d,-1);        d[0] = 0;        scanf("%d%d%d",&n,&k,&t);        p[0] = (People){0,0,0};        FOR(i,n) scanf("%d",&p[i].t);        FOR(i,n) scanf("%d",&p[i].p);        FOR(i,n) scanf("%d",&p[i].s);        sort(p+1,p+1+n);        for(int i=1;i<=n;i++){            for(int j=i-1;j>=0;j--){                if(d[j]==-1) continue;                if(p[i].t-p[j].t >= abs(p[i].s-p[j].s))                    d[i] = max(d[i],d[j]+p[i].p);            }        }        int ans = 0;        for(int i=1;i<=n;i++) ans = max(ans,d[i]);        printf("%d\n",ans);        if(T) printf("\n");    }    return 0;}


 

 

0 0