Codeforces 798D 二維貪心找可行解

2021-08-25 08:43:51 字數 2164 閱讀 5292

給兩個序列a,b然後找你找到乙個下標集合pp的個數p.

size

≤⌊n2

⌋+1 p.s

ize≤

⌊n2⌋

+1

,然後以p為下標的ab集合記作a2

b2a 2b

2,滿足2∗

sum(

a2)>su

m(a)

2 ∗s

um(a

2)

>su

m(a)

和2∗sum(

b2)>su

m(b)

2 ∗s

um(b

2)

>su

m(b)

。 題目保證解一定存在。

首先,基於貪心的策略,我們讓p.

size

=⌊n2

⌋+1 p.s

ize=

⌊n2⌋

+1

,人多力量大麼,不等式的左邊個數多,就越容易大於右邊的(貪心)。

然後,我們發現這是個二維貪心,必須ab同時滿足。

最後也是最重要的,題目要求的是可行解,而不是最優解。做題的時候沒想到這點,一直想如何讓不等式的左面最大。其實這是不必要的,只要滿足不等式就行。

我們先想一維貪心。

如果是最優解:直接把序列從大到小排,然後取前p.

size

p .s

iz

e個就是最大的,很簡單。

如果是可行解:

從左到右,兩兩組成一對(先不考慮奇數和偶數的問題,實時上等你明白貪心的規律,你就會發現題目中p.

size

p .s

iz

e中加1就是為了方便奇數情況),比如說: a=

[8,7

,4,8

] a=[

8,7,

4,8]

,第一對87,找到最大的8,第二對48,找到最大的8,分別找到他們的索引值14,組成p集合,這樣一定是可行解。

為什麼?仔細看不等式的左面,係數2保證所有值計算時都會成以2倍,我們在選取的時候每次保證在每兩個之中選擇乙個較大的,那麼現在我們把陣列分成了兩堆,du

i大和d

ui小 dui

大和du

i小

。那麼不難知道2∗

dui大

>du

i大+d

ui小 2∗d

ui

大>du

i大+d

ui小。

我們知道的一維狀況下的最優解和一維狀況下的可行解。

我們現在可以把a序列先從大到小排個序,然後從左往右掃a序列的索引值,然後把這些索引值放到b序列中,然後把b序列兩兩組對,找最大值,相當於一維貪心找可行解了。

因為a排過序了,我們可以肯定,取a中的,一定都是較大的,然後按照一維的思路,我們找b的可行解,這樣我們保證ab都是可行解了,注意,這裡a不是最優解。(說的有點亂,可以看**,比較清楚)。

#include

using

namespace

std;

const

int maxn = 100010;

pair a[maxn];

int b[maxn],n;

bool cmp(pair lhs, pair rhs)

int main(void)

Codeforces 798B 字串暴力

給n個字串,每個字串都可以做乙個操作 字串的第一位移到字串的末尾,剩下的字元向前進一位,問最少做多少次操作,所有字串能相等。第一開始我想到的是純模擬,模擬字串向前移動的過程,然後n2 n 2搜尋最優解,不知不覺寫了5個for迴圈,算了一下複雜度505 109 505 109 心想肯定t了,然後交了一...

CodeForces 732D 二分 貪心

思路 二分列舉答案,在限定時間內判斷這個時間能否完成。貪心策略是盡量晚的安排每個考試。ac include include include include include include include include include include include include include ...

CodeForces1311D 思維 二分

給你三個整數a,b,c 每一次操作你可以讓三個其中之一 1 或者 1,你可以執行無限次這樣的操作,但是你不能將他們變成非正數。你需要找到最小運算元以至於b是a的倍數,c是b的倍數。t組資料,1 t 100 每組三個數a,b,c。1 a b c 1e4 根據資料範圍,可以想到去列舉其中的乙個數,然後c...