记录编号 444565 评测结果 WWWWWWWWWW
题目名称 [NOIP 2010冲刺二]宝物筛选 最终得分 0
用户昵称 GravatarCSU_Turkey 是否通过 未通过
代码语言 C++ 运行时间 0.215 s
提交时间 2017-09-03 11:54:41 内存使用 16.65 MiB
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
int n,w[105],c[105],m,f[105][40005],v[105];
int head=1,tail;
struct ghb{
	int val,seat;
}que[40005];
int read(){
	int a=0;
	char ch=getchar();
	while(!(ch<='9'&&ch>='0'))ch=getchar();
	while(ch<='9'&&ch>='0'){
		a=(a<<1)+(a<<3)+ch-'0';
		ch=getchar();
	}
	return a;
}
int main()
{
	freopen("treasure.in","r",stdin);
	freopen("treasure.out","w",stdout);
//	freopen("1.txt","r",stdin);
	que[0].val=0x3fffffff;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		v[i]=read();
		w[i]=read();
		c[i]=read();
	}
	for(int i=1;i<=n;i++){
		for(int j=0;j<w[i];j++){
			head=0,tail=0;
			for(int k=j;k<=m;k+=w[i]){
				int now=f[i-1][k]-(k/w[i])*v[i];
				if(now<=que[tail].val){
					que[++tail].val=now;
					que[tail].seat=k/w[i];
				}
				else{
					while(que[tail].val<now&&head<=tail){//head<=tail很有必要,不然head假如已经到了10了,tail却继续往10之前找,就不合法了 
						tail--;
					}
					que[++tail].seat=k/w[i];
					que[tail].val=now;
				}
				if(que[head].seat+min(c[i],k/w[i])<k/w[i]){
					head++;
					if(head>tail)que[tail].val=0x3fffffff;//这里表示如果队列空了,就给tail附一个极大值,保证下一个元素能一定进队
					//但后来我发现好像没必要,因为上面给了特判,如果队列空了,就不进入while了 
				}
				f[i][k]=que[head].val+k/w[i]*v[i];
			}
		}
	}
	cout<<f[n][m];
	return 0;
}