這種題用 C 語言除了用生成隨機數暴力猜答案之外,還能怎麼算?

時間 2021-05-31 09:43:31

1樓:Richard Xu

既然 @靈劍 提到了「逼格」……

我初三的時候機緣巧合參加了NOIWC 09',當年的最後一題「優化設計」參見這裡:

所以題主的這個問題其實就可以寫成45個布林變數(x12,x13,...x110,x23,....,x910),然後用5個布林表示式來保證上述5個式子成立,再來10個布林表示式來保證每個數字不會被重複使用……然後就是這道題的乙個樣例輸入了嘛!

接下來就可以用這道題的標程來解決了!

然鵝我並不知道此題的標程是怎樣的……

(我會告訴你我用隨機生成的方式水了50分嗎?)

2樓:陳碩

Python:

import

itertools

for(a1,

a2,b1,

b2,c1,

c2,d1,

d2,e1,

e2)initertools

.permutations

(range(1

,11)):ifa1+

a2==

13andb1-

b2==

2andc1+

c2==

12andd1-

d2==

4ande1+

e2==6:

print(a1

,a2,b1

,b2,c1

,c2,d1

,d2,e1

,e2)執行結果:

$ time python3 perm.py3 10 9 7 4 8 6 2 1 5

3 10 9 7 4 8 6 2 5 1

3 10 9 7 8 4 6 2 1 5

3 10 9 7 8 4 6 2 5 1

4 9 8 6 2 10 7 3 1 5

4 9 8 6 2 10 7 3 5 1

4 9 8 6 10 2 7 3 1 5

4 9 8 6 10 2 7 3 5 1

6 7 10 8 3 9 5 1 2 4

6 7 10 8 3 9 5 1 4 2

6 7 10 8 9 3 5 1 2 4

6 7 10 8 9 3 5 1 4 2

7 6 10 8 3 9 5 1 2 4

7 6 10 8 3 9 5 1 4 2

7 6 10 8 9 3 5 1 2 4

7 6 10 8 9 3 5 1 4 2

9 4 8 6 2 10 7 3 1 5

9 4 8 6 2 10 7 3 5 1

9 4 8 6 10 2 7 3 1 5

9 4 8 6 10 2 7 3 5 1

10 3 9 7 4 8 6 2 1 5

10 3 9 7 4 8 6 2 5 1

10 3 9 7 8 4 6 2 1 5

10 3 9 7 8 4 6 2 5 1

real 0m0.679s

user 0m0.666s

sys 0m0.013s

3樓:Milo Yip

C++ 有 std::next_permutation,10 行搞定:

#include

#include

intmain();

dowhile

(std

::next_permutation(a

,a+10

));}

輸出:$ g++ -std=c++11 -O3 a.cpp && time ./a.out

3 10 9 7 4 8 6 2 1 5

3 10 9 7 4 8 6 2 5 1

3 10 9 7 8 4 6 2 1 5

3 10 9 7 8 4 6 2 5 1

4 9 8 6 2 10 7 3 1 5

4 9 8 6 2 10 7 3 5 1

4 9 8 6 10 2 7 3 1 5

4 9 8 6 10 2 7 3 5 1

6 7 10 8 3 9 5 1 2 4

6 7 10 8 3 9 5 1 4 2

6 7 10 8 9 3 5 1 2 4

6 7 10 8 9 3 5 1 4 2

7 6 10 8 3 9 5 1 2 4

7 6 10 8 3 9 5 1 4 2

7 6 10 8 9 3 5 1 2 4

7 6 10 8 9 3 5 1 4 2

9 4 8 6 2 10 7 3 1 5

9 4 8 6 2 10 7 3 5 1

9 4 8 6 10 2 7 3 1 5

9 4 8 6 10 2 7 3 5 1

10 3 9 7 4 8 6 2 1 5

10 3 9 7 4 8 6 2 5 1

10 3 9 7 8 4 6 2 1 5

10 3 9 7 8 4 6 2 5 1

real 0m0.014s

user 0m0.011s

sys 0m0.001s

4樓:

再怎麼暈頭,也扯不到『隨機數』身上呀

因為 a + b 和 b + a 一樣,為了免去大量的重複,所以只輸出a#include

#include

bool unique( unsigned buf, size_t n )

{ unsigned mark = 0;

while( nif( (mark & (1u<輸出3 + 10 = 13

9 - 7 = 2

4 + 8 = 12

6 - 2 = 4

1 + 5 = 6

4 + 9 = 13

8 - 6 = 2

2 + 10 = 12

7 - 3 = 4

1 + 5 = 6

6 + 7 = 13

10 - 8 = 2

3 + 9 = 12

5 - 1 = 4

2 + 4 = 6

C 如何生成不重複大隨機數?

悽臨雨 設計一種一一對映的函式f x 0 21億一一對映到0 21億 然後取前n個x,然後f 隨機種子 1 f 隨機種子 n 就是你要的前n個不相同的隨機數。至於如何產生這樣的函式?我們知道十進位制是A 10000 B 1000 E 1。對位的順序做交換 交換D和E,會變成00,10,20,30,9...

怎麼用c語言使用規則取樣法生成SPWM?

Longson 假設直流母線電壓為 選取相電壓基準值為 定義調制度為相電壓幅值與基準值的比值 三相調製波為 其中 為 a 相電壓相位,分別為基波角頻率,頻率,週期。定義載波頻率為 載波週期為 對稱規則取樣是以每個三角載波的對稱軸 波峰或波谷 所對應的時間作為取樣時刻。假設在三角波的波谷時刻對調製波進...

用c語言如何判斷乙個三位數是否是對稱數?

豆戰聖佛 首先對輸入進行判斷是否符合題意為三位整數 以此數除以100,商即為百位 以此數對10取餘,餘數即為個位 無需判斷十位,只需看百位與個位等同與否,得解。 貪墨 1 先看輸入的資料型別,是char還是int2 根據input的不同,有以下兩種 1 char型別 char num 4 num 0...