为什么我的代码交上去会RE两个点,开了O2就过了啊
查看原帖
为什么我的代码交上去会RE两个点,开了O2就过了啊
176012
200610311a楼主2021/8/11 12:37
#include<bits/stdc++.h>
using namespace std;
bool pr[1000000];
long long vis1[1000000],f1[1000000],vis2[1000000],f2[1000000],pri[1000000],ll;
long long dp2(int);
long long dp1(int n){
	//printf("%d\n",n);
	if(vis1[n])return f1[n];
	vis1[n]=1;
	for(int i=0;pri[i]<=n;i++)
	f1[n]=min(f1[n],1+dp2(n-pri[i]));
	return f1[n];
}
long long  dp2(int n){
//	printf("%d\n",n);
	if(vis2[n])return f2[n];
	vis2[n]=1;
	for(int i=0;pri[i]<=n;i++)
	f2[n]=max(f2[n],1+dp1(n-pri[i]));
	return f2[n];
}
int main()
{
	vis1[0]=vis1[1]=1;
	vis2[0]=vis2[1]=1;f2[0]=0;f2[1]=0;
	for(int i=0;i<=20000;i++)f1[i]=1000000000;
	for(long long i=2;i<=20000;i++){
		if(pr[i]==0){
			vis1[i]=1;f1[i]=1;vis2[i]=1;f2[i]=1000000000;
			pri[ll++]=i;
			for(long long j=i*i;j<=20000;j+=i)pr[j]=1;
		}
	}
	int a;
	scanf("%d",&a);
	for(int i=0;i<a;i++){
		int n;scanf("%d",&n);
		printf("%lld\n",dp1(n)>=1000000000?-1:dp1(n));
	}
	return 0; 
}
2021/8/11 12:37
加载中...