8月20日考試題解(思維題 貪心 數論 動態規劃)

2022-03-26 10:15:34 字數 2672 閱讀 8655

t2打暴力都能拿80分,可怕。

t1題目大意:給定乙個實數序列$a$。設$s=\sum_^n a_i$。你可以做下列操作$n$次:

選擇兩個未被選過的下標$i,j$,將$a_i$變為不超過$a_i$的最大整數,將$a_j$變為不小於$a_j$的最小整數。要求操作完成後新的序列中元素之和與原來的差值的絕對值盡可能小。現給定一段序列和多個詢問區間,要求對詢問區間求解。

顯然整數對答案是沒有影響的。設$cnt$表示區間內的小數個數,$sum$表示區間原來的和,$top$表示區間內所有數都上取整後的和,$n$表示區間最多的操作次數。

顯然$top$不是最優的答案,肯定有一些數要選擇下取整。對應的操作就是$top$減$1$。但有一些限制條件,要進行分類討論:

1.$top$不管怎麼減。其值都是大於原來的值的。我們直接減就好。

2.注意到如果有最優答案,其值和原來序列和的差值不超過$0.5$。因為如果大於$0.5$我們總有辦法將差值調整到小於$0.5$。所以我們在$cnt$,$n$,$floor(top-sum+0.5)$間取$\min$。如果取到最優答案了就先用整數頂上去,整數不夠了再用小數,以保證答案的最優性。

**:

#includeusing

namespace

std;

const

int maxn=500005

;int

n,q,l,r;

double

sum[maxn],t[maxn],x,c[maxn];

intmain()

while(q--)

printf(

"%.3lf\n

",abs(top-ss));

}return0;

}

t2題目大意:給定一棵含有$n$個結點的樹,每條邊長度為1。有$m$個形如$a,b,d$的限制條件,意為找到距離$a$和$b$的總長度不超過$d$的點$x$。要求找到滿足這$m$個條件的任意一點,如果沒有輸出$no$。

一道神奇的貪心題,但並不會證明其正確性。直接說做法:

根據題意,我們將限制條件轉化為$dis(a,x)+dis(b,x)\leq d$

設$dist(x,a,b)$表示$x$到鏈$ab$的距離,則有:

$dist(x,a,b)*2+dis(a,b)\leq d$

接下來我們推式子:

$dist(x,a,b)*2\leq d-dis(a,b)$

$dist(x,a,b)\leq \frac$

注意到樹上路徑長度可以用點的深度表示,我們有:

$dep[x]\geq dep[lca(a,b)]-\frac$

易知$dis(a,b)=dep[a]+dep[b]-2*dep[lca(a,b)]$,轉化為:

$dep[x]\geq \frac$

設不等式右邊的值為$w[i]$,顯然我們要找到這個最大的$w[i]$,且可以找出對應的$a,b$。然後我們遍歷一遍樹,找到滿足這個條件的且深度最小的點,看這個點能不能滿足其他的限制條件。如果不能則無解。反則此點為答案。

**:

#includeusing

namespace

std;

const

int maxn=100005

;int dep[maxn][5

],n,m;

ints[maxn],t[maxn],d[maxn];

inthead[maxn],cnt,mx,pos;

struct

node

edge[maxn*2

];inline

intread()

while(isdigit(ch))

return x*f;

}inline

void add(int

from,int

to)inline

void dfs(int now,int fa,int

opt)

}signed main()

dfs(

1,0,0

);

for (int i=1;i<=m;i++)

for (int i=1;i<=m;i++)

if (max(0,dep[s[i]][0]+dep[t[i]][0]-d[i])==mx)

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

if (dep[i][1]+dep[i][2]<=mx&&(!pos||dep[i][0]0])) pos=i;

dfs(pos,

0,3);

for (int i=1;i<=m;i++)

if (dep[s[i]][3]+dep[t[i]][3]>d[i])

printf("%d

",pos);

return0;

}

t3題目大意:乙個數可以寫成多個$2$的次方之和。現給定$t$個數,求解數的拆分方案。例如,$4$有$4$種方案:

$4=2^0+2^0+2^0+2^0$

$4=2^1+2^0+2^0$

$4=2^1+2^1$

$4=2^2$

只會遞推的分,$n\leq 10^7$。打表可以發現:

if (i%2) ans[i]=ans[i-1]+ans[i/2+1

];else ans[i]=ans[i-1]+ans[i/2];

正解動態規劃。傳送門:

12月14日考試題反思

本大周學習了遞迴和高精。又進行了考試,結果爆零了,總結後是自己沒掌握。還是看題吧!第一題大意 給兩個字串,找出重疊字元輸出對數並排列。題看了很久才明白意思,前面幾問的思路是有的,可排列函式sort的用法卻忘了,想了許久,還是先敲 為上。最初 如下 include using namespace st...

3月15日考試 題解(數學 揹包 線段樹)

這次好不容易ak了一次 雖然題有點白給。有的題還是比較考驗思路的。t1 放棋子 給乙個n n的棋盤,有n個棋子。棋盤的副對角線不能放棋子 即 i j n 1 的位置 每行每列只能擺乙個棋子。每個棋子都視為是不同的。問有多少種擺法。n leq 1314520 答案對1e8 7取模。典型的錯排問題。我們...

8月20日考試T3 題解(數論 動態規劃)

此題太毒瘤了,以至於我單獨為它寫一篇題解。題目大意 任何自然數都可以用 2 的整數冪之和來表示。現在給定 t 組資料,每組乙個 n 求 n 用 2 的整數冪之和表示的方案數。n leq 10 首先科普一波伯努利數 設自然數冪和 s n sum limits i k 將其用關於 n 的 m 1 次多項...