カメヲラボ

主にプログラミングとお勉強全般について書いてます

Space Elevator

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);
}