暑假訓練第二週第三天

2021-10-08 04:50:31 字數 1960 閱讀 2833

c:codeforces - 1260e

題意:現在有n個人打拳,序號小的打不過序號大的,並且如果你花ai元賄賂第i個人,你就能贏,且你可以分配每次比賽的組隊以及賄賂,問你最少需要多少錢能贏到最後。

思路:a個人進入到了前a強,那麼按能力值從小到大,就必須第1個人前面有至少(n/a)-1個人;第2 個人前面至少2*(n/(a)-1) 個人…如果賄賂的人不在n/a 到 n 之間,那麼必定在n/(a*2) 到 (n/a)-1 之間,但這裡面最多總共有(n/a)-3個人 < 2 * (n/(a2)-1),所以不可能。但中間那塊判斷勝者的條件語句,弄得我有點迷。用資料推了兩次感覺把自己繞進去了。

**:

在這裡插入**片 #include.h>

using

namespace std;

#define ll long long

const

int n=

1e6+5;

ll a[n]

;multisets;

intmain()

}printf

("%lld"

,ans)

;return0;

}

d codeforces - 1251d salary changing

思路:用pair陣列儲存每個員工的最小和最大工資,然後進行降序排序。記過程中工資中位數為mid,我們選定乙個區間二分查詢這個mid;如果所有員工都發放最小工資,那麼此刻的mid就應該是所有mid的下界,而總工資s則應該是mid的上界。每次選定乙個mid後,我們應該判斷這個mid合不合適,判斷條件是能找到(n+1)/2個人的工資可以達到mid且總工資不會超過s,貪心選取這個(n+1)/2個人。

複習完貪心感覺看題解就舒服多了,二分查詢作為邊界值來構建貪心策略。

**:

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const ll maxn =

200005

;struct node

a[maxn]

;bool

cmp(node x,node y)

ll n,s;

bool

check

(ll x)

else

if(a[i]

.r >= x && sum >= x - a[i]

.l)}

if(cnt >= n /2+

1)return

true

;return

false;}

intmain()

sort

(a +

1,a +

1+ n,cmp)

;

ll l = a[n /2+

1].l,r =

2000000000

;while

(r - l >1)

else

}printf

("%lld\n"

,l);

}return0;

}

e:codeforces - 1251b

題意:n串01字串,問你經過任意交換後,最後能得到多少個回文串。

思路:判斷沒有奇數長度的字串以及1的個數和0的個數都為奇數。乙個思維的思路,之前看的是貪心的解法,配合今天的複習基本看的差不多了,但果然b題還是作為思維題來做的舒服。

**:

#include

#include

using

namespace std;

intmain()

}if(a[0]%

2&&a[1]

%2&&!flag)

n--; cout<}return0;

}

暑期訓練第二週第三天

今天的訓練還是複習上週做過的習題,因此我就直接寫感想了。感想剛開始的時候,其實我並不是很理解問什麼要花這麼長的時間來複習前面做過去的題目,有這時間做兩道新題多好呢。但後來我又仔細的想了想,如果沒有練習的話,這些空餘的時間我可能會去學一下新東西,做做題,但絕對不可能去複習之前的題目。那麼對於老師來說 ...

第二週第三天

集合 什麼是集合 set 集合是容器 序列 將 作為容器的標誌,裡面多個元素歐陽那個逗號隔開 元素1,元素2 集合是可變的,無序的,並且自帶去重功能 要求 元素必須是不可變的,唯一的 空集合 s1 set 集合的數 算 交集,並集,差集,對稱子集,子集和真子集 交集 求兩個集合的公共部分 並集 合併...

2017 8 2暑假集訓第三天

今天仍舊在做搜尋題 本來想著今天把昨天比賽的de題先做做來著 結果做了做搜尋就沒有停下來 明天再做de題吧!搜尋做得也差不多了 剩下的就是圖論了,有點困難啊 比搜尋還困難 畢竟沒怎麼練過 今天做了a了五個題,8.9.10.11.13 第8題還好,素數轉換的題,畢竟是課件上的原題 還是比較容易的 第1...