1. 程式人生 > >北京理工大學OJ的Mid難度題目的題解

北京理工大學OJ的Mid難度題目的題解

這裡是北京理工大學OJ的Mid難度題目的題解
只有思路沒有程式碼的哦
我會盡量完整地展現自己的思路歷程

11 XC的緞帶

首先,如果把布條都剪成長度1來補洞,有n個洞,要剪n刀,
很顯然,如果此時都不能補上所有洞,就輸出‘-1’

然後,很自然地想到相鄰的洞,可以不耗費代價,把補它們的布條合併
形如題例的‘1 1 0 0 1 0 1 0’中的‘0 0’
每合併這樣的兩個漏洞,可以少剪1刀

依次類推,額外消耗相應長度的布條,來合併距離為1,2……的洞
只要布條夠用,每合併1次,可以少剪1刀
這就是此題的貪心思路

24 求函式最大值

取了點巧,應該是資料不夠強

直接從L開始列舉,L+0.1,……,總共取了1e5個點測試,取其中f(x)的最大值
emmmmmm,AC了,時間還挺短

29 字母梯形

46 數塔

簡單DP

48 易男神和他的小粉絲

1e5個月有8333年,易男神真是長壽(呱)

dp[i]表示包括第i個月,已經連續漲粉的月數
dp[i] = a[i] > a[i-1] ? dp[i-1]+1 : 1
pd[i]表示包括第i個月,之後連續漲粉的月數
pd[i] = a[i] < a[i+1] ? dp[i+1]+1 : 1

之後修改其中一個月為前一月+1或者後一月-1
考察前後的大小關係,啦啦啦啦之類的就行了

49 龍神和平行四邊形

強烈譴責不按照題述給用例的樂色出題人,死ね!

顯然,成對的線段不用折,可以處理出一個每種長度只有一根的陣列

那麼只有四種情況
a、一根折完,和另兩根形成了兩對,成對線段+2
b、一根折完,和另一根形成了一對,成對線段+1
c、折完自交形成一對,成對線段+1
d、數組裡只有孤獨的一根,且是奇數長度

答案就是成對線段的一半,向下取整

51 Love Diamond Forever.jpg

實際上是求一個葉子結點都為(質量1的月狗)的哈夫曼樹
*哈夫曼樹就是一棵所有節點價值和最小的樹
如例2:

當然我們生成這棵樹的方法是DP
dp[i]表示把一個質量為i的月狗分解為i個質量為1的月狗們受到的最小傷害
damage[i]表示質量為i的月狗造成的傷害
一旦dp[i]想到了,轉移方程就很好想到
dp[i]=min(dp[x]+dp[y]+damage[i]) 其中 0<x,y<i 且 x+y=i

特別地,上面所說的根節點,也就是質量為M的月狗,不會造成傷害
因為質量為M的月狗還沒咬鑽石,鑽石就把它劈成兩半了

52 很會dp

這題揹包容量太大了,肯定不能dp
值得注意的是物品只有35個,我們肯定從這方面入手
可以百度“大容量揹包問題”找來做,很鍛鍊思維

2^35太大沒有辦法列舉
但是它的一半,2^18不大,我們可以把35件物品分成兩份,分別列舉可能的體積
然後對於其中一份中的每一個體積,都在另一份中二分查詢即可