唐納德先生與這真的是簽到題嗎(數學)

2021-09-10 01:37:44 字數 1537 閱讀 4045

原題:

題意:

有乙個n長陣列,兩兩相加得到乙個n(n-1)/2的陣列,給出這個n(n-1)/2的陣列(排序後),求出原陣列(任意解)

解析:

假設原陣列從小到大為a1,

a2,a

3...

an

a_1,a_2,a_3...a_n

a1​,a2

​,a3

​...

an​,它們的和中,最小的一定是a1+

a2

a_1+a_2

a1​+a2

​,其次是a1+

a3

a_1+a_3

a1​+a3

​,但是a2+

a3

a_2+a_3

a2​+a3

​排第幾不知道。

但是,我們知道a2+

a3

a_2+a_3

a2​+a3

​可以排到的最後面是第n位(前面是a1+

a2..

a1+a

na_1+a_2..a_1+a_n

a1​+a2

​..a

1​+a

n​),所以我們列舉a2+

a3

a_2+a_3

a2​+a3

​的名次,那麼就可以解出a1,

a2,a

3a_1,a_2,a_3

a1​,a2

​,a3

​分別使什麼,我們將這三個數的兩兩之和從原陣列中刪除,那麼此時最小的就是a1+

a4

a_1+a_4

a1​+a4

​,那麼就得到了a

4a_4

a4​;再刪除a

4a_4

a4​和前面的數的和,以得到a

5a_5

a5​……

在求a 1,

a2,a

3a_1,a_2,a_3

a1​,a2

​,a3

​的時候有個細節,就是不能除二會出錯

#include

using namespace std;

#define ll long long

#define debug(i) printf("# %d\n",i)

int a[

50100];

multiset<

int>s;

multiset<

int>

::iterator it;

int ans[

301]

;bool fin

(int idx,

int n)

}return1;

}int

main()

for(

int i=

3;i<=n;i++

)for

(int i=

1;i<=n;i++)}

}

3675 唐納德先生與假骰子

單點時限 6.0 sec 記憶體限制 1024 mb 嗨,唐納德先生又來了。他又帶了一枚假骰子,這個骰子的各個面的點數依然是 1,2,3,4,5,6,但是六個面向上的概率卻不一定都是 1 6,而變成了 p1,p2,p3,p4,p5,p6。現在它要跟你玩乙個遊戲。首先你也得準備一枚骰子,各個面的點數同...

EOJ 3452 唐納德先生和假骰子

題目描述 在進行某些桌遊,例如 uno 或者麻將的時候,常常會需要隨機決定從誰開始。骰子是一種好方案。普通的骰子有六個面,分別是一點 二點 三點 四點 五點 六點,六面向上的概率相同。由於骰子只能產生六種情況,而實際桌遊時,卻常常有三到四人,所以,我們在擲骰子時,常常採用兩顆骰子,這個 隨機的選擇 ...

EOJ 3452 唐納德先生和假骰子 暴力

題目鏈結 題目意思 給你乙個數字p,代表人數,接著給出你兩個骰子的六個面的數值,現在要你將骰子向上的點數和對人數取餘,得到的餘數分別為0到p 1,現在問你遊戲是否公平。解題思路 數值很小我們就用暴力求出兩個骰子的六個面的點數和,然後對p取餘,看得到的餘數的個數是否一樣,一樣代表遊戲公平,否則遊戲不公...