深搜专题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----------------------------------------------------------------------------

浙公网安备 33010602011771号