线性筛法+DFS 超时两个点 求助大佬怎么改进,谢谢dalao

P1579 哥德巴赫猜想(升级版)

天上一颗蛋 @ 2017-11-03 20:42:46

#include<iostream>
#include<cstdlib>
using namespace std;
const int maxn=21000;
bool p[maxn];
int temp[3];
int biao[maxn];
int s;
int n;
int all;
void prime(int n){
    for(int i=2;i<n;i++){
        if(p[i]==0){
            biao[s]=i;
            s++;}
            for(int j=0;j<s && i*biao[j]<n;j++){
                p[i*biao[j]]=1;
                if(i%biao[j]==0){
                    break;
                    }
                }
            }
        }
void print(){
    for(int i=0;i<3;i++){
    cout<<temp[i]<<" ";
    }
}
void dfs(int index,int num){
    if(index>n)return;
    if(num==3){
        if(all==n){
            print();
            exit(0);
            }
        return;
        }
    if(all<n&&num<3){
        temp[num]=biao[index];
        all+=biao[index];
        dfs(index,num+1);
        all-=biao[index];
        dfs(index+1,num);
        }
    }
int main(){
    cin>>n;
    prime(n);
    dfs(0,0);//深搜超时#7 #10难过。。。
}

by KillerXu @ 2017-11-04 21:34:19

想多了,别受题解和讨论影响,不过是二重循环+素数判断是绝对能过的,最慢不到0.1秒


by KillerXu @ 2017-11-04 21:36:01

其实,怎么说呢……好多人被这题折磨的死去活来


by KillerXu @ 2017-11-04 21:37:12

都是因为看到数据的原因,其实不是三重循环是可以过的


by 天上一颗蛋 @ 2017-11-04 21:54:56

为什么???

这不科学啊


by 天上一颗蛋 @ 2017-11-04 22:52:29

@许思远 还是不懂

枚举判断怎么会比打表快呢?


by KillerXu @ 2017-11-05 20:29:42

#include<stdio.h>
int ss(int n)
{
    int i;
    for(i=2;i<n;i++) if(n%i==0) return 1;
    return 0;
}
int main()
{
    int i,j,n,flag=0;
    scanf("%d",&n);
    for(i=2;i<=n/2;i++)
    {
     for(j=2;j<n;j++)
     {
         if(ss(i)==0&&ss(j)==0&&ss(n-(i+j))==0&&n-i-j!=0)
         {
             printf("%d %d %d",i,j,n-(i+j));
             flag=1;
            }
            if(flag) break;
            }
            if(flag) break;
        }
        return 0;
}

|