纪中暑假集训 2020.08.03【NOIP提高组】模拟 T1:【NOIP2015模拟11.5】Prime

【NOIP2015模拟11.5】Prime

Description

在这里插入图片描述

Input

在这里插入图片描述

Output

在这里插入图片描述

Sample Input

输入1:
6
14 20 33 117 143 175
输入2:
4
2 4 7 9

Sample Output

输出1:
3 2
输出2:
2 2

Data Constraint

纪中暑假集训 2020.08.03【NOIP提高组】模拟 T1:【NOIP2015模拟11.5】Prime_第1张图片

反思&题解

考试思路: 纯暴力 (可喜的是居然有60分!!!)
正解思路: 二分组数之后暴力判断
反思: 优化暴力的能力还是要加强

CODE

#include
using namespace std;
int n,a[20],zu[20][20],ans1,ans2,anss;
bool bz[20],hz[20][20];
int gcd(int x,int y)
{
	while (x%y!=0)
	{
		int t=x;
		x=y;
		y=t%y;
	}
	return y;
}
void dfs(int t,int k,int mx,int num)
{
	if (t>num) return;
	if (mx>=anss) return;
	if (k>n)
	{
		if (mx<anss) anss=mx;	
	}	
	else
	{
		int i;
		for (i=1;i<=t;i++)
		{
			bool flag=true;
			int j;
			for (j=1;j<=zu[i][0];j++)
			{
				if (!hz[k][zu[i][j]])
				{
					flag=false;
					break;	
				}		
			}
			if (flag)
			{
				zu[i][0]++;
				zu[i][zu[i][0]]=k;
				if (zu[i][0]>mx) dfs(t,k+1,zu[i][0],num);
				else dfs(t,k+1,mx,num);
				zu[i][0]--;	
			}	
		}
		zu[t+1][0]=1;
		zu[t+1][1]=k;
		if (mx<1) dfs(t+1,k+1,1,num);
		else dfs(t+1,k+1,mx,num);
		zu[t+1][0]=0;		
	}	
}
int main()
{
	freopen("prime.in","r",stdin);
	freopen("prime.out","w",stdout);
	scanf("%d",&n);
	int i;
	for (i=1;i<=n;i++)
		scanf("%d",&a[i]);
	int j;
	for (i=1;i<n;i++)
	{
		for (j=i+1;j<=n;j++)
		{
			int x,y;
			if (a[i]>a[j])
			{
				x=a[i];
				y=a[j];
			}
			else
			{
				x=a[j];
				y=a[i];
			}
			int t=gcd(x,y);
			if (t==1)
			{
				hz[i][j]=true;
				hz[j][i]=true;
			}
		}
	}
	int l=1,r=n;
	while (l<=r)
	{
		int mid=l+r>>1;
		anss=0x3f3f3f3f;
		dfs(1,1,0,mid);
		if (anss!=0x3f3f3f3f)
		{
			ans1=mid;
			ans2=anss;
			r=mid-1;
		}
		else l=mid+1;
	}
	printf("%d %d\n",ans1,ans2);
	return 0;
}

你可能感兴趣的:(题解,反思)