| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
多重背包加单调队列优化为什么不能过。。求数据,附代码#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#define maxn 410
#define maxm 40010
using namespace std;
int quen[maxm],quev[maxm];
int head,tail;
int a[maxn],h[maxn];
int c[maxn],r[maxn];
int dp[maxm];
int n,u,m;
int i,j,d;
int cmp(int i,int j){
return a[i]<a[j];
}
void insert(int x,int y){
while (head<=tail&&quev[tail]<y) tail--;
quen[++tail]=x;quev[tail]=y;
}
int main(){
while (scanf("%d",&n)==1){
if (n==0) {printf("0\n");continue;}
for (i=1;i<=n;i++)
scanf("%d%d%d",&h[i],&a[i],&c[i]);
for (i=1;i<=n;i++) r[i]=i;
sort(r+1,r+n+1,cmp);
memset(dp,0,sizeof(dp));
m=a[r[n]];
for (i=1;i<=n;i++){
u=r[i];
for (d=0;d<h[u];d++){
head=1;tail=0;
for (j=0;j<=(a[u]-d)/h[u];j++){
insert(j,dp[j*h[u]+d]-j*h[u]);
while (head<=tail&&quen[head]<j-c[u]) head++;
//while (head<=tail&&quev[head]+j*h[u]>a[u]) head++;
dp[j*h[u]+d]=j*h[u]+quev[head];
}
}
//for (j=1;j<=m/2;j++) if (dp[j]!=0)
// printf("%d %d\n",j,dp[j]);
//system("pause");
}
printf("%d\n",dp[m]);
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator