HDU - 5943 Kingdom of Obsession 二分匹配

题目链接:点击查看

题意:给你s,n,要求给s+1,s+2...s+n,这n个数编号1-n,满足每个数膜编号为0,问是否存在

题解:打表发现两个素数的差值不足300,我们可以发现素数的因子只有1和他们本身,当n>s时,两个区间有交集,我们让这些数的编号为他们自己即可,而剩余的数怎么操作呢,我们交换s,n,即可(当s<n时),当时我还纳闷直接匹配不就行了,这样是不行的,因为我们在判断n的时候给了个定值判断,比如s=1,n=100000000,这种情况也是合适的,像这种情况我们直接判断100000000 1就行了

#include<iostream>
#include<cstdio>
#include<cmath>
#include<vector>
using namespace std;
typedef long long ll;
int match[810],vis[810];
int mp[810][810];
int n,s;
int dfs(int u)
{
	for(int i=1;i<=n;i++)
	{
		if(mp[u][i]==0 || vis[i]) continue;
		vis[i]=1;
		if(match[i]==-1 || dfs(match[i]))
		{
			match[i]=u;
			return 1;
		}
	}
	return 0;
}
int main()
{
//	int maxx=-1;
//	len=1;
//	for(int i=2;i<=100000000;i++)
//	{
//		if(!ok[i]) prime[len++]=i,maxx=max(maxx,prime[len-1]-prime[len-2]);
//		for(int j=1;j<len&&(ll)prime[j]*i<=100000000;j++)
//		{
//			ok[i*prime[j]]=1;
//			if(i%prime[j]==0) break;
//		}
//	}
//	cout<<maxx<<endl;
	int T;
	int nn=1;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d",&n,&s);
		printf("Case #%d: ",nn++);
		if(s<n) swap(s,n); 
		if(n>=300)
		{
			printf("No\n");
			continue;
		}
		for(int i=0;i<=n;i++) match[i]=-1,vis[i]=0;
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
			{
				if((s+i)%j==0) mp[i][j]=1;
				else mp[i][j]=0;
			}
		}
		int flag=1;
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++) vis[j]=0;
			if(!dfs(i))
			{
				flag=0;
				break;
			}
		}
		printf(flag?"Yes\n":"No\n");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/mmk27_word/article/details/88420670