寒假ACM集訓複習總結Day1 helman

2022-09-01 08:48:08 字數 1791 閱讀 3659

b題

codeforces 1110b

一開始是沒想出來的。

講的是用k根繃帶粘住n個壞掉的地方,求用最少的繃帶

原本的想法是將每種可能的粘法窮舉出來,求最少的繃帶

但是換個方向看,每個壞掉的地方都要粘住,意味著每處都用了一的繃帶

此時用的繃帶數就是n,每填補兩個壞處之間的距離,就會使得繃帶數減一

要想只用k根繃帶,並且使繃帶總長最短,就是在原本n的繃帶長度上加上n-k個最短距離

於是答案就很簡單了

#include using

namespace

std;

typedef

long

long

ll;const

int maxn=1e5+7

;int

main()

sort(b+1,b+n);

int ans=0

;

for(int i=1;i<=n-k;i++)

ans+=b[i];

cout

}return0;

}

d題codeforces 1111b

d題一開始也沒想出來

講的是給出n個超級英雄的能量,操作是減少乙個英雄或增加乙個英雄的1點能量

每個英雄最多操作k次,總共操作最多m次,求最大的平均能量

感覺可以算,但不知道怎麼算

實際上這個題思路應該是乙個個試

首先留下第一強的英雄,如果總算子少於剩下的英雄數(想刪掉剩下的英雄),就繼續新增強的英雄

因為無論怎麼操作,都不能去掉目前新增的這些英雄

為什麼第一目的的刪掉英雄而不是強化英雄呢

是因為理想情況下能量n和n-1的英雄,刪掉弱的後平均值是n,強化一點後平均值是n

而當強的英雄和弱的英雄差距變大時,刪掉弱的增長更快

而當總算子不少於剩下的英雄數時,就可以考慮刪掉剩下的英雄

將剩下的英雄全部刪掉,多出的操作強化目前的英雄,求得這種狀況下的平均值

接著不斷加入新的強英雄,刪掉剩下的英雄,求得當前情況下的平均值

最後比較得到最大的平均值

#includeusing

namespace

std;

const

int nmax=1e6+7

;typedef

long

long

ll;int

a[nmax];

intmain()

ll sum=0

;

double ans=0

; sort(a+0,a+n);

for(int i=n-1;i>=0;i--)

}printf(

"%lf

",ans);

return0;

}

e題codeforces 1108b

e題是給出x,y(x<=y)的因子,讓我們還原這兩個數

這就需要思考一下

乙個數的因子包含自己,所以這堆數里最大的數就是y

接下來又分成幾種情況

x是y的因子

那麼出現兩個相鄰且相等的數就是x

x不是y的因子

那麼出現乙個不是y因子的數就是x

#include using

namespace

std;

intmain()

else

if(d[i]==d[i-1]||d[i]==d[i+1

])

}}

寒假集訓系列DAY 1

problem a.string master master.c cpp pas 題目描述 所謂最長公共子串,比如串 a abcde 串 b jcdkl 則它們的最長公共子串為串 cd 即長 度最長的字串,且在兩個串中都作為連續子串出現過。給定兩個長度都為 n 的字串,對於字串大師的你來說,求它們的...

寒假ACM集訓複習總結Day3 helman

這一天學的是貪心演算法和暴力列舉 感覺比第一天的思維題還簡單,也許是因為全部列出來是人的普遍想法吧 那就放幾個經典例題吧 hdu 2037 一道經典的看電視的問題,給出一系列節目的開始結束時間,算出你最多能看幾部 思路是要對每個節目的結束時間從小到大排序,每次選擇結束時間早的不和上乙個節目衝突的節目...

2020寒假集訓Day1 分治 總結

已經會了東西就略過了 下面就是自己新學會的 1 d維數點的bitset暴力方法 o d n 2 w 每個點開d個bitset,分別排序遞推,然後把答案 起來即可 乙個trick bitset按編號分塊,多做幾次,可以節省記憶體,例題 傳遞閉包 想想我以前只會o d n 2 2 cdq分治解決動態凸殼...