| 比赛 | 
    防止颓废的小练习v0.3 | 
    评测结果 | 
    AAAAAAAAAA | 
    | 题目名称 | 
    宝物筛选 | 
    最终得分 | 
    100 | 
    | 用户昵称 | 
    SOBER GOOD BOY | 
    运行时间 | 
    0.379 s  | 
    | 代码语言 | 
    C++ | 
    内存使用 | 
    0.46 MiB  | 
    | 提交时间 | 
    2016-10-19 14:56:15 | 
显示代码纯文本
#include<iostream>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<deque>
using namespace std;
const int maxv=51000,maxn=301;
int f[maxv]={0};
struct Node{
	int num,data;
	Node(int a,int b)
	{
		num=a,data=b;
	}
};
void Init();
int main()
{
	freopen("treasure.in","r",stdin);
	freopen("treasure.out","w",stdout);
	Init();
	return 0;
}
void Init()
{
	deque<Node> q;
	int n,W;
	scanf("%d%d",&n,&W);
	for(int i=1;i<=n;i++)
	{
		int c,w,t;
		scanf("%d%d%d",&c,&w,&t);
		for(int j=0;j<w;j++)
		{
			q.clear();
			for(int k=0;k<=W/w;k++)
			{
				int temp=f[j+k*w]-k*c;
				while(!q.empty()&&temp>=q.back().data) q.pop_back();
				q.push_back(Node(k,temp));
				if(!q.empty()&&q.front().num<k-t) q.pop_front();
				f[j+k*w]=q.front().data+k*c;
			}
		}
	}
	printf("%d",f[W]);
}