站内P1857题求助
  • 板块学术版
  • 楼主Luxe877
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/5/4 11:55
  • 上次更新2024/5/4 14:18:53
查看原帖
站内P1857题求助
519986
Luxe877楼主2024/5/4 11:55

dp+博弈论的题目,但是不知道为啥WA #9,求助各位大佬(本人dp萌新还在死磕),玄关。

还有这份代码不知道为啥厌氧,RE的问题可以不用说了。

#include<bits/stdc++.h>
using namespace std;
long long T,n;
long long p=0,pr[200002];
bool num[200002];
void ols(int x)
{
	memset(num,false,sizeof(num));
	num[0]=num[1]=true;
	for(int i=2;i<=x;i++)
	{
		if(num[i]==false)
		{
			p++;
			pr[p]=i;
		}
		for(int j=1;pr[j]<=x/i;j++)
		{
			num[pr[j]*i]=true;
			if(i%pr[j]==0)
			{
				break;
			}
		}
	}
}
long long dp[20002];
bool wl[20002];
int main()
{
	cin>>T;
	ols(20000);
	memset(wl,false,sizeof(wl));
	wl[0]=wl[1]=false;//true=win,false=lose
	dp[0]=dp[1]=0;
	for(int i=2;i<=20000;i++)
	{
		for(int j=1;pr[j]<=i;j++)
		{
			if(!wl[i-pr[j]])
			{
				wl[i]=true;
				break;
			}
		}
	}
	for(int i=2;i<=20000;i++)
	{
		if(wl[i])
		{
			dp[i]=0x3f3f3f3f;
		}else{
			dp[i]=0;
		}
		for(int j=1;pr[j]<=i;j++)
		{
			if(wl[i])
			{
				if(!wl[i-pr[j]])
				{
					dp[i]=min(dp[i],dp[i-pr[j]]+1);
				}
			}else{
				if(wl[i-pr[j]])
				{
					dp[i]=max(dp[i],dp[i-pr[j]]+1);
				}
			}
		}
	}
//	for(int i=1;i<=20;i++)
//	{
//		cout<<dp[i]<<" ";
//	}
//	cout<<endl;
	while(T--)
	{
		cin>>n;
		if(!wl[n])
		{
			cout<<"-1\n";
		}else{
			cout<<dp[n]<<endl;
		}
	}
	return 0;
}
/*
8:2 3 5 7
9:2 3 5 7
16:2 3 5 7 11 13

0<=n<=1时结束 

8:8-7=1 end
9:impossible
16:16-7=9 9先手必败,2步结束 
*/


2024/5/4 11:55
加载中...