新生友誼賽

2022-08-04 10:00:13 字數 3003 閱讀 4430

不敢出什麼演算法題,題目以一些基礎的dp題為主,重遞推的思路。

a題:算是7道裡面的水題了,遞推比較容易想。而且這道題其實是考察卡特蘭數,我部落格之前就寫過這道題的題解和相關拓展。詳細題解給鏈結,自己前往:

b題:期望dp,仍然是詳細題解給鏈結,自己前往:

c題:簡單dp,我打了一版記憶化搜尋ac了,不過要注意就是陣列只需要開50*50就行,開1000*1000估計就t了。題意:一根木棍長為l,然後要切n刀,這n刀的具體位置給出,每切一刀的代價為當前被切木棍的總長度,求總代價的最小值。想了下發現貪心不行,開始想dp。分析一下比較容易發現:你每切一刀,對後續產生的影響無非是被切的木棍一分為二,那麼你狀態轉移也就是從這兩小段裡轉移過來的。dp[i,j]=min+j-i (k是i,j之間的木棍切割點),這個式子仔細想想應該能理解,當然這裡的i,j和k指的都是具體的座標長度,由於總長最大為1000,所以如果這樣寫你就必須要開到1000*1000的陣列了。顯然這裡是可以優化的,單獨用陣列c[i]表示第i個位置的具體座標,然後狀態轉移方程就變成dp[i,j]=min+c[j]-c[i](k是i,j之間的木棍切割點編號),與之前類似但dp卻只要開50*50就可以了。思路就這樣,可以記憶化搜尋dfs打,也可以直接dp遞推轉移。**如下:

#include #include 

#include

#include

using

namespace

std;

int l,c[55],dp[55][55

];int dfs(int u,int

v)int

main()

}

d題:這題比較有意思,主要是不好想到突破點,算是一道比較難的題了。題目短,題意好懂就不再複述。

首先應注意到這個條件:(a-1)2

< b < a 2    這個條件轉化一下就變成了0

#include #include 

#define ll long long

using

namespace

std;

ll m;

struct

martix;

martix mul(martix a,martix b)}}

returnc;}

martix pow(martix a,ll b)

returnc;}

intmain()

return0;

}

e題:本來這題準備放道防ak的難題,結果想想還是算了,換了道水題。看懂題意,開始憑感覺瞎猜就能差不多得出結論了,試著打一發然後就ac了。

就是找規律,發現結論就是:把m,m,m-1,m-1,m-2,m-2,m-3,m-3..........前n項求出來輸出即可。

構造的時候那行最小的最大行應該排列如下:.....      m-3  m-2  m-1  m    |   m  m-1  m-2  m-3    . ....

至於怎麼證明,這我就沒仔細想了,據說網上有證明,我沒認真去看具體證明,但還是給個別人具體證明的鏈結,感興趣的可以去看看。

一切為了ac,就憑感覺猜!**如下:

#include#include

#include

using

namespace

std;

intn,m;

intmain()

printf(

"%d\n

",sum*2-(m-(n-1)/2

)); }

}

f題:概率dp,看上去跟省賽那道還有點像,其實還是有本質區別的。詳細題解給鏈結,自己前往:

g題:題意:數軸上有n個城市,給出n個城市的具體位置,選擇其中的m個城市建造郵局,求所有城市到對應最近郵局的距離之和的最小值。

這是道比較經典的dp了,看資料範圍那麼小肯定也是dp了,n^3都能過了,預處理一下,我是n^2的預處理,但是n^3的預處理也是能ac的。定義dp[i][j]表示前i個城市裡已經建造了j個郵局的最短距離,然後考慮狀態轉移,dp[i][j] = min(dp[i][j],dp[k][j-1]+sum[k+1][i])相當於列舉決策前i個城市中哪個城市建造第j個郵局,sum[i][j]表示在i到j範圍內的城市中只建造乙個郵局的距離之和(這個就是需要預處理的部分),dp[maxn][maxm]是我們要求的。sum[i][j]傳統的預處理是暴力n^3的,其實是可以優化的。例如:求sum[1][4]的話郵局需要建立在2或者3處,放在2處的消耗為p4-p2+p3-p2+p2-p1=p4-p2+p3-p1(pi代表具體位置),

放在3處的結果為p4-p3+p3-p2+p3-p1=p4+p3-p2-p1,可見,將郵局建在2處或3處是一樣的。現在接著求sum[1][5],現在處於中點的村莊是3,那麼1-4到3的距離和剛才已經求出了,即為sum[1][4],所以只需再加上5到3的距離即可。同樣,求sum[1][6]的時候也可以用sum[1][5]加上6到中點的距離。

預處理的sum[i][j]其實是滿足遞推式:

sum[i][j]=sum[i][j-1]+(v[j]-v[posti])(其中posti=(i+j)/2)v陣列是用來儲存n個城市對應位置的。預處理完然後初始化dp的起始邊界:dp[i][1] = sum[1][i],最後就開始遞推dp就行了,暴力n^3的dp。**如下:

#include #include 

#include

#define maxn 305

#define inf 0x3f3f3f3f

using

namespace

std;

intv,p,v[maxn],sum[maxn][maxn],dp[maxn][maxn];

void

init()

}int

main()

for(int i=1; i<=v; i++)}}

printf(

"%d\n

",dp[v][p]);

}return0;

}

整體來說,這些題目都不難,比賽也只有3小時,不管怎樣,賽後把題都弄懂吧,好好總結,一起加油~

五校新生友誼賽(部分題解)

f題 原題 傳送門 題意 如題目,從乙個棋盤的右上角 1,m 每次可以往左,下,左下移動,誰不能移動誰就輸了。思路 先可以從小範圍入手,1x1時先手必敗點,一行或者一列的時候奇數點先手必敗。如3x3的圖 l 先手必敗 w 先手必勝lw lwww lwl能看出規律當n與m為奇數的時候先手必敗。可畫大些...

Hut Csust 新生友誼賽第一場 解題報告

此次和長沙理工的友誼賽我個人的感覺是 坑!我個人首先就被a題絆住了。1個小時之後,跑去看rank。d題一片ac。於是才放下了a題跑去做d題。之後看到b題ac的人也不少了,跑去a掉b題。之後是e。然後卡在了f題。囧。由於f題有一種情況沒有考慮到。一直在重寫 修正 自己的演算法。提交了9次後,終於發現了...

運維部的籃球友誼賽

enjoy work,enjoy life 運維部的同學在緊張的工作之餘,組織開展了部門內 外激情洋溢的籃球比賽。曬曬幾張精彩 華麗的瞬間 op部門內比賽 看我們強勢中鋒,萬鈞雷霆。畫外音 身高好處多,看我火鍋 op部門內比賽 罰球中,這個視角很有感覺吧 狂突爆砍,內外結合,各種變向拉桿,發威啦 o...