50pts求调,玄关。。。
查看原帖
50pts求调,玄关。。。
247472
cjsy18114楼主2025/1/20 11:43

本人部分测试点WA,评测记录如下:
link
代码如下:

#include<bits/stdc++.h>
using namespace std;
int n,m;
struct node
{
	int ii,vi,ci,qi;  
};node *a;
int *f;
bool bmp(node x,node y)
{
	return x.qi<y.qi;
}
int ssum(int j,int i,int r,int o)
{
	int ss;
	switch(o)
	{
		case 1:
		ss=(j>=a[i].vi+a[r].vi?a[i].ci+f[j-a[r].vi-a[i].vi]+a[r].ci:0);break;
		case 2:
		ss=(j>=a[i].vi+a[r+1].vi?a[i].ci+f[j-a[r+1].vi-a[i].vi]+a[r+1].ci:0);break;
		case 3:
		ss=(j>=a[i].vi+a[r].vi+a[r+1].vi?a[i].ci+f[j-a[i].vi-a[r].vi-a[r+1].vi]+a[r].ci+a[r+1].ci:0);break;
	}
	return ss;
}
int main()
{
	scanf("%d%d",&n,&m);a=new node[m+1];
	f=new int[n+1];int p;
	memset(f,0,sizeof(int)*(n+1));
	for(int i=1;i<=m;i++)
	{
		a[i].ii=i;
		scanf("%d%d%d",&a[i].vi,&p,&a[i].qi);
		a[i].ci=p*a[i].vi;
	}
	sort(a+1,a+m+1,bmp);
	int t,r;
	for(r=1;r<=m&&a[r].qi==0;r++); //找到第一个附件 
	t=r-1;
	for(int i=1;i<=t;i++)
	{
		if(r<=m&&a[r].qi==a[i].ii)  //有附件 
		{
			if(r+1<=m&&a[r+1].qi==a[i].ii)  //有两个附件 
			{
				for(int j=n;j>=a[i].vi;j--)
				{
					f[j]=max(max(max(max(f[j],f[j-a[i].vi]+a[i].ci),ssum(j,i,r,1)),ssum(j,i,r,2)),ssum(j,i,r,3));
				} 
				r+=2;
			}
			else  //仅有一个附件 
			{
				for(int j=n;j>=a[i].vi;j--)
				{
					if(j>=a[i].vi+a[r].vi)
						f[j]=max(max(f[j],f[j-a[i].vi-a[r].vi]+a[i].ci+a[r].ci),f[j-a[i].vi]+a[i].ci);
					else
						f[j]=max(f[j],f[j-a[i].vi]+a[i].ci);
				}
				r++;
			}
		}
		else  //无附件 
		{
			for(int j=n;j>=a[i].vi;j--)
				f[j]=max(f[j],f[j-a[i].vi]+a[i].ci);
		}
	}
	printf("%d\n",f[n]);
	return 0;
}

感谢大佬相助!!!

2025/1/20 11:43
加载中...