hdu 1016
w 1031
素数环
时间比较的短,要注意奇偶剪枝,
只有 奇数可以成环,可以直接输一遍看一下,然后就是 奇数+奇数=偶数+偶数=偶数!=质数;
从这里有可以继续减少分支。
要特别的注意:用c语言的输入输出,不要用c++的,c++的endl,用了没有修改结果 还是时间超时,另外代码里面不 要有注释,注释最好都去掉,也有可能会影响运行时间。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int sprim[]={2,3,5,7,11,13,17,19,23,29,31};
int s[20],n;
bool vis[20];
bool isture(int x,int y)
{
int se(x+y);
for (int i=0;i<13;i++)
if (se==sprim[i])
return true;
return false;
}
void tofind(int x)
{
if (x>n)
{
if (!isture(s[1],s[x-1]))
return;
printf("%d",s[1]);
for (int i=2;i<=n;i++)
printf(" %d",s[i]);
printf("\n");
return;
}
for (int i=2;i<=n;i++)
{
if ((i+s[x-1])%2==0)
continue;
if(!vis[i]&&isture(s[x-1],i))
{
s[x]=i;
vis[i]=1;
tofind(x+1);
vis[i]=0;
}
}
}
int main()
{
int i(1);
while (cin>>n)
{
if(n&1)
continue;
memset(vis,0,sizeof(vis));
vis[1]=1;
s[1]=1;
tofind(2);
}
return 0;
}
w1008 选数
这道题更加的坑爹,一个等于号搞了我还去下输入数据。
没有什么好讲的,就是每次的选的数的序号必须比前面的大。
不然的话,代码就是 全排序了。
#include <iostream>
#include <cstring>
using namespace std;
int n,k;
int sev[25];
int s,t; // 控制序数
long long sum;
bool vis[25];
bool isprim(long long x)
{
if(x==1||x==0)
return false;
for (int i=2;i*i<=x;i++) // 要注意这里“=” 写成 x+1也可以
if (x%i==0)
return false;
return true;
}
void tofind(int x)
{
int tt; // 辅助控制前面的序数要比后面的大
tt=t;
if(x>k)
{
if (isprim(sum))
s++;
return;
}
for(int i=1;i<=n;i++)
{
if (!vis[i]&&t<i)
{
vis[i]=1;
t=i;
sum+=sev[i];
tofind(x+1);
t=tt;
sum-=sev[i];
vis[i]=0;
}
}
}
int main()
{
while (cin>>n>>k)
{
memset(vis,0,sizeof(vis));
s=t=0;
sum=0;
for (int i=1;i<=n;i++)
cin>>sev[i];
tofind(1);
cout<<s<<endl;
}
return 0;
}