第一想法是:全排列+判斷
原**如下
#include#includeint n, a[25], prime[38] = // 參考別人的空間換時間方法——打表法
;int judge( int x)
} if( !prime[ a[n] + a[1]])
return 1;
}int swap( int b, int c)
void pailie( int k)
printf("%d", a[i]);
flag = 1;
}printf("\n");
} }else }}
int main(void)
pailie(2); // 從第2個元素開始排列
return 0;
}
但是這個演算法實在是太慢了,基本上到12就要崩潰了。。。原題資料範圍是0-20,需要換全排列的方法以及剪枝
每次都排列出來再判斷太麻煩了,應該一邊排列一邊判斷,把不合格的數列扼殺在搖籃裡。
我做了乙個優化,但是出了一些問題
#include#includeint n, a[25], prime[38] =
;int judge( int x)
} if( !prime[ a[n] + a[1]])
return 1;
}int swap( int b, int c)
void pailie( int k)
printf("%d", a[i]);
flag = 1;
}printf("\n");
} }else
else
} }}int main(void)
pailie(2);
} return 0;
}
雖然都能出結果,但是輸出的時候不按照字典順序,事實上這個演算法本來就沒有辦法按照字典順序輸出!
所以需要換乙個演算法,在網上查了一下,原來在劉汝佳的書上就有tot,用回溯就能做出來
390ms ac的。。。弱爆了
#include#include#includeint n, a[25] =, prime[38] =
;int vis[25];
void pailie( int k)
printf("%d", a[i]);
flag = 1;
}printf("\n");
} return;
} else
} }}int main(void)
return 0;
}
之後改了改沒什麼本質性區別啊 249ms,
#include#include#includeint n, a[25] =, prime[38] =
;int vis[25];
void pailie( int k)
printf("%d", a[i]);
flag = 1;
}printf("\n");
} else
} }}int main(void)
return 0;
}
航電1016題 素數環
具體題目參照航電1016 如下 include using namespace std int n int ans 17 int hash 17 bool isprime 32 int prime error 後面未加 void initprime for int i 0 i 11 i void c...
杭電OJ 2012 素數判定
problem description 對於表示式n 2 n 41,當n在 x,y 範圍內取整數值時 包括x,y 39 x y 50 判定該表示式的值是否都為素數。input 輸入資料有多組,每組佔一行,由兩個整數x,y組成,當x 0,y 0時,表示輸入結束,該行不做處理。output 對於每個給定...
飯卡 杭電oj
解題思路就是沒有5元的直接輸出 大於5元的要用5元貪心價值最大的 減去5元後的錢要最優即動態規劃中的01揹包 include include include using namespace std int c 1005 1005 int max int a,int b int main m1 m m...