应hfu要求,近几日整理搜索专题的内容,无意中翻出了一年前死活A不掉的一道不可做题(当时觉得)。看着自己的代码风格变化天翻地覆,无奈感叹时间飞逝。。。算了少矫情管他的先A了再说(ง •̀_•́)ง
先附上一年前WA(8/10)的代码
#include<stdio.h>
int n,divide[15][10],sum[15]={0},t,a[15],num1,ans=0;
int prime(int a,int b)
{
if (a==b) return 0;
for (int s=2;s<=a/2;s++)
if (a%s==0&&b%s==0) return 0;
return 1;
}
void f(int p,int q)
{
if (ans!=0) return ;
if (num1==n)
{
ans=q;
return ;
}
int i;
for (i=1;i<=q;i++)
{
int j;
for (j=1;j<=sum[i];j++)
if (prime(a[p],divide[i][j])==0) break;
if (j==sum[i]+1)
{
divide[i][sum[i]+1]=a[p];sum[i]++;num1++;
for (int k=1;k<=q-1;k++)
for (int b=1;b<=q-k;b++)
if (sum[b]<sum[b+1])
{
for (int h=1;h<=sum[b+1];h++)
{
t=divide[b][h];divide[b][h]=divide[b+1][h];divide[b+1][h]=t;
}
t=sum[b];sum[b]=sum[b+1];sum[b+1]=t;
}
break;
}
}
if (i==q+1)
{
divide[q+1][1]=a[p];sum[q+1]++;num1++;
}
if (i==q+1) f(p+1,q+1);
if (i<q+1) f(p+1,q);
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
divide[1][1]=a[1];sum[1]=1;num1=1;
f(2,1);
printf("%d",ans);
return 0;
}
再来看看一年后的今天1A的代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int n;
int a[12],cnt=0,mn=12;
int gcd(int a,int b) {
return !b?a:gcd(b,a%b);
}
vector<int> G[12];
void dfs(int p) {
if (p>n) {mn=min(mn,cnt);return ;}
for (int i=1;i<=cnt;++i) {
bool f=true;
for (int j=0;j<G[i].size();++j)
if (gcd(a[p],a[G[i][j]])^1) {f=false;break;}
if (f) {
G[i].push_back(p);
dfs(p+1);
G[i].pop_back();
}
}
++cnt;
G[cnt].push_back(p);
dfs(p+1);
G[cnt].pop_back();
--cnt;
}
int main() {
// freopen("OJ 7384.in","r",stdin);
scanf("%d",&n);
for (int i=1;i<=n;++i) scanf("%d",&a[i]);
dfs(1);
printf("%d\n",mn);
return 0;
}