社区讨论

请求加强数据

P1616疯狂的采药参与者 7已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@mi5wjvq3
此快照首次捕获于
2025/11/19 19:11
3 个月前
此快照最后确认于
2025/11/21 00:01
3 个月前
查看原帖
CPP
#include<cstdio>
#include<random>
#include<cstring>
#include<iostream>
using namespace std;
mt19937 myrand(30077);
int n,V;
int v[10005],w[10005];
long long lst,mem[10000005];
bool hasmem[10000005];
int vati,xn;
long long dfs(int len,int sumv){
    if(len>n)return 0;
	if(hasmem[sumv]) if(myrand()%3)return mem[sumv];
	long long ans=mem[sumv];
	for(long long sw=0,sv=sumv;sv<=V;sv+=v[len],sw+=w[len]){
		long long zc=dfs(((myrand()+2)%vati)?(len+1):((myrand()+6)%(n-len+1)+1+len),sv)+sw;
		if(zc>ans) ans=zc;
		else if(!(myrand()%16)){
			zc=dfs(len+2+myrand()%5,sv)+sw;
			if(zc>ans)ans=zc;
		}
	}
	hasmem[sumv]=true;
	if(ans>mem[sumv])mem[sumv]=ans;
	return ans;
}
int main(){
	scanf("%d%d",&V,&n);
	for(int i=1;i<=n;i++) scanf("%d%d",&v[i],&w[i]);
	if(n*V>9000000)xn=2;
	else xn=40;
	for(int i=1;i<=xn;i++){
		memset(hasmem,0,sizeof(hasmem));
		if(myrand()%2)vati=rand()%10+1;
		else vati=myrand()%1083+2;
		lst=max(lst,dfs(1,0));
	}
	memset(mem,0,sizeof(mem));
	for(int i=1;i<=xn;i++){
		memset(hasmem,0,sizeof(hasmem));
		if(myrand()%2)vati=rand()%10+1;
		else vati=myrand()%1083+2;
		lst=max(lst,dfs(1,0));
	}
	printf("%lld\n",lst);
	return 0;
}
https://www.luogu.com.cn/record/248208998
显然这玩意是错解
但是A了
建议增多有强度的测试数据组数(现在的数据就#4有强度,剩下的随机化写好点随便过)
(具体到这篇代码可以构造n=V=3000去卡,但是不能彻底解决掉这个思路,可以用倒数确定xn,最有效的方法还是增多有强度的数据,防止A#4就全A)

回复

6 条回复,欢迎继续交流。

正在加载回复...