杭電OJ1016 素數環

2021-07-02 02:27:37 字數 1654 閱讀 7943

第一想法是:全排列+判斷

原**如下

#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...