OpenJudge 7384(分成互质组)

来源:互联网 发布:淘宝卖家被投诉后果 编辑:程序博客网 时间:2024/06/06 17:12

应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;}
原创粉丝点击