深搜专题996(二)

带来的是一波题解~~~~~~

1、

#include <cstdio>
#include <algorithm>
int n;
char s[505];

int main() {
    int n;
    long long ans = 0;
    scanf("%d", &n);
    scanf("%s", s + 1);
    std::sort(s + 1, s + n + 1);
    do {
        for (int i = 1; i <= n; ++i) putchar(s[i]);
        putchar('\n');
        ++ans;
    } while (std::next_permutation(s + 1, s + n + 1));
    printf("%lld\n", ans);
    return 0;
}
(个人很喜欢上面这种写法)

/*我实在是想不出能够在任何情况下过这道题的搜索算法,于是毫不犹豫上排列组合*/
/*搜索算法一直是弱菜*/
#include<cstdio>
#include<cstring>
#define mo 10000
char s[501],PNb[501];
int num[256],PNn[501];
int exist[501],ans[5000];
int n;

void InitPN(int n)
{
    memset(PNb,1,sizeof(PNb));
    PNb[0]=0;
    PNb[1]=0;
    for (int i=2;i<=n;i++)
        if (PNb[i]) {
            PNn[++PNn[0]]=i;
            for (int k=i*2;k<=n;k+=i) {
                PNb[k]=0;
            }
        }
}

void mul(int * a,int c)
{   
    int i,x=0;  
    for (i=1;i<=a[0];i++)  
    {    
        a[i]=a[i]*c+x;    
        x=a[i]/mo;    
        a[i]=a[i]%mo;  
    }  
    while(x>0)
    {
        a[++a[0]]=x%mo;
        x=x/mo;
    }
}
    
void print_arr(int * a)
{  
    int i;  
    printf("%d",a[a[0]]);
    for (i=a[0]-1;i>0;i--)    
        printf("%04d",a[i]);
    putchar('\n');
}


int main(void)
{
    scanf("%d",&n);
    while (getchar()!='\n');
    gets(s);
    for (int i=0;i<n;i++) num[s[i]]++;
    InitPN(n);
    for (int i=1;i<=PNn[0];i++) {
        for (int k=PNn[i];k<=n;k*=PNn[i]) {
            exist[i]+=n/k;
        }
    }
    /*for (int i=1;i<=PNn[0];i++)
        printf("%d ",exist[i]);  
    putchar('\n'); */
    for (int nu=0;nu<=255;nu++) {
        if (num[nu]>1) {
            int tmp=num[nu];
            for (int i=1;i<=PNn[0];i++) {
                for (int k=PNn[i];k<=tmp;k*=PNn[i]) {
                    exist[i]-=tmp/k;
                }
            }
        }
    }
    /*
    for (int i=1;i<=PNn[0];i++)
        printf("%d ",exist[i]);
    putchar('\n');
    */
    ans[0]=1;
    ans[1]=1;
    for (int i=1;i<=PNn[0];i++)
    {
        for (int j=1;j<=exist[i];j++)
            mul(ans,PNn[i]);
    }
    print_arr(ans);
    //puts(s);
    return 0;
}


2、

 

#include<cstdio>
#include<cstdlib>
int a[10000],ans[10000],sum[10000],n,c;
void print(int n)
{
    for (int i=1;i<n;i++)
        printf("%d ",ans[i]);
    putchar('\n');
    exit(0);
}
void search(int x,int tot,int k)
{
    if (tot>c) return ;
    if (tot==c) print(k);
    if (tot+sum[x]<c) return ;
    for (int i=x;i<=n;i++)
    {
        ans[k]=a[i];
        search(i+1,tot+a[i],k+1);
    }
}
int main(void)
{
    scanf("%d%d",&n,&c);
    for (int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for (int i=n;i>0;i--)
        sum[i]=sum[i+1]+a[i];
    if (sum[1]>=c) search(1,0,1);    
    puts("No Solution!");
    return 0;
}

 

#include<iostream>
#include<cmath>
#include<cstdlib>
using namespace std;    
int n,a[10000000],b[10000000],m,i,k=1,s=0;
bool f[10000000];
void print(int k)
{
    for (i=1;i<=k;++i)cout<<b[i]<<" ";
    exit(0);
}

void gcd(int k,int s,int m)
{   
    int i;
    if (s>m)return;
    if (k>n){cout<<"No Solution!";exit(0);}
    for (i=1;i<=n;++i)
    if (f[i])
    {
        f[i]=false;
        s=s+a[i];
        b[k]=a[i];
        if (s==m){print(k);}
          else gcd(k+1,s,m);
        s=s-a[i];
            f[i]=true;
            b[k]=0;
    }
    
    return ;
}


int main()
{
    cin>>n;    cin>>m;
    for (i=1;i<=n;++i)cin>>a[i];
    for (i=1;i<=n;++i)f[i]=true;
    gcd(k,s,m);
    return 0;
}

 

3、

 

#include<iostream>
#include<cstring>
using namespace std;
int n,a[30][30],mi;
bool b[30];

void go(int x,int s)
{
    if (s>=mi) return;
    if (x>n)
    {
        mi=s;
        return;
    }
    int i;
    for (i=1;i<=n;i++)
    if (!b[i])
    {
        b[i]=true;
        go(x+1,s+a[i][x]);
        b[i]=false;
    }
}
int main()
{
    int i,j;
    cin>>n;
    for (i=1;i<=n;i++)
      for (j=1;j<=n;j++)
      cin>>a[i][j];
    mi=999999999;
    memset(b,0,sizeof(b));
    go(1,0);
    cout<<mi<<endl;
    return 0;
}

 

#include<cstdio>
int a[25][25],b[25]={0},n,min=1000000000;

void search(int s,int t)
{
    if(t>min) return;
    if(s>n) return;
    for(int i=1;i<=n;i++)
      if(!b[i])
      {
          b[i]=1;
          t+=a[s][i];
          if(s<n) search(s+1,t);
                else if(t<min) min=t;
          b[i]=0;
          t-=a[s][i];
      }
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
      for(int j=1;j<=n;j++) scanf("%d",&a[i][j]);
    search(1,0);
    printf("%d",min);
    return 0;
}

 

4、

 

#include<iostream>
#include<cstdlib>
using namespace std;
int n,a[100],s;
void go(int x)
{
    if (x>n)
    {
        s++;
        return;
        }
    int i;
    for (i=1;i<=3;i++)
    if (a[x-3]*10+a[x-2]!=a[x-1]*10+i)
    {
        a[x]=i;
        go(x+1);
        }
}
int main()
{
    cin>>n;
    if (n<=2)
    {
        if (n==1) cout<<3;
        else cout<<9;
        cout<<endl;
        exit(0);
        }
    s=0;
    int i,j,k;
    for (i=1;i<=3;i++)
      for (j=1;j<=3;j++)
        for (k=1;k<=3;k++)
      {
            a[1]=i; a[2]=j; a[3]=k;
            go(4);
            }
    cout<<s<<endl;
    return 0;
}

------------------------------------------------------------End----------------------------------------------------------------------------

 

posted @ 2022-01-25 14:17  November&&Rain  阅读(42)  评论(0)    收藏  举报