http://acm.pku.edu.cn/JudgeOnline/problem?id=2392
- 息抜きのつもりだったのに(´ω`)
息抜きのつもりでやってみたものの、TLEに引っかかり悩む。高さ限度の値が小さい順にソートして、DPってかんじのコードを書いたら通らない。重複要素を入れないようにすれば速くなるしmemory limitにもかからんだろうってことで書き直したのに、通らない(;´д`)うえーん。
で、しばらく大きなデータを食わせたりして調べてみて、あまりに遅すぎるわけではないことに気付いたので、乗算回数を減らしてギリギリAccept。しかし他の人たちはほとんどが200ms以内で通しているので、私のやり方がアホなのだろうか・・・。
以下、とりあえず通ったコード
typedef struct _T{
int h,a,c;
}T;
T t[500];
int s[50000],v[50000],tb[40001];
int i,j,k,l,n,b,c,tmp;
q(T*a,T*b){return a->a-b->a;}
main(){
scanf("%d",&n);
for(i=0;i<n;++i)scanf("%d%d%d",&t[i].h,&t[i].a,&t[i].c);
qsort(t,n,sizeof(T),q);
l=1;
for(i=0;i<n;++i){
for(k=j=0;j<l;++j){
for(b=0,c=t[i].c,tmp=s[j]-t[i].h;b<=c&&(tmp+=t[i].h)<=t[i].a;++b){
if(tb[v[k] = tmp]!=i+1){
tb[v[k]]=i+1;
++k;
}
}
}
l=k;
for(j=0;j<l;++j)s[j]=v[j];
}
for(i=j=0;i<l;++i)j=j>s[i]?j:s[i];
printf("%d",j);
}