社区讨论
请求加强数据
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 条回复,欢迎继续交流。
正在加载回复...