7.13某中題解

1.分隊問題

描述

給定n 個選手,將他們分成若干只隊伍。其中第i 個選手要求自己所屬的隊
伍的人數大等於a[i]人。
在滿足所有選手的要求的前提下,最大化隊伍的總數。
注:每個選手屬於且僅屬於一支隊伍。

輸入格式

第一行一個整數 n,表示人數。 以下 n 行,每行一個整數表示 a[i]。

輸出格式

輸出隊伍總數的最大值。數據保證有解。

數據範圍

對於 20%的數據,n <= 10 對於 40%的數據,n <= 1000 對於 60%的數據,n <= 10000 對於 100%的數據,1 <= n <= 10^6

考試時想的是貪心,沒想dp,沒有讀入優化。。。

正解:

將選手的a[i] 從小到大排個序,然後dp:
狀態:f[i] 表示前i名選手能構成的最多隊伍數。
方程:f[i]=maxf[j]+1 其中j<=ia[i]
然後用maxx[j] 提前計算前j個f的最大值即可。
時間複雜度:O(n)

2.子矩陣

題目描述

小 A 有一個 N×M 的矩陣,矩陣中 1~N*M 這(N*M)個整數均出現過一次。 現在小 A 在這個矩陣內選擇一個子矩陣,其權值等於這個子矩陣中的所有數的最 小值。小 A 想知道,如果他選擇的子矩陣的權值爲 i(1<=i<=N×M),那麼他選擇 的子矩陣可能有多少種?小 A 希望知道所有可能的 i 值對應的結果,但是這些結 果太多了,他算不了,因此他向你求助。

輸入格式

第一行,兩個整數 N,M。 接下來的 N 行,每行 M 個整數,表示矩陣中的元素。

輸出格式

N×M 行,每行一個整數,其中第 i 行的整數表示如果小 A 選擇的子矩陣權 值爲 i,他選擇的子矩陣的種類數。

數據範圍

對於 30%的數據,1<=N,M<=50; 對於全部的數據,1<=N,M<=300。

考試時想的O(n4) 暴力處理拿30分。

正解:

先用O(n3) 處理出每個以i爲矩陣上邊,以j爲下邊,第k列的小子矩陣的最小值。
然後使用單調棧,將對於每個元素可以延伸的左右界求出即可。總共O(n3)
顯然對於一個子矩陣的最小值,它會影響左邊,右邊比它大的元素延伸矩陣,就可以用單調棧了。

3.數字對

題目描述

對於一個數字對(a,b),我們可以通過一次操作將其變爲新數字對(a+b,b)或(a, a+b)。 給定一正整數 n,問最少需要多少次操作可將數字對(1,1)變爲一個數字對, 該數字對至少有一個數字爲 n。

輸入格式

第一行一個正整數 n

輸出格式

一個整數表示答案。

數據範圍

對於 30%的數據, 1<=n<=1000 對於 60%的數據, 1<=n<=20000 對於 100%的數據,1<=n<=10^6

考試時打表後迭代加深然後卡時才苟且通過。。。。太弱了。

正解:

顯然從11 遞推到n肯定不可行,就考慮從n反推回去。
對於x,y ,顯然x!=yx,y>=0 ,所以只有可能通過xy,y 或者xyx 其中一種情況推回x,y ,而想到gcd過程就是輾轉相除,即輾轉相減,因此用gcd()模擬加速相減,就可算出(x,y)得到需要的次數。計算n與1至n-1的gcd()即可。時間複雜度:O(nlog2n)

反思與總結:

需要改進的:
T1:1.思考貪心算法時一定要證明自己的算法是正確的,或者努力推翻自己的算法,dp能用時就用dp;
2.數據大時要使用讀入優化。
T2:1.要注意分析最小值的性質:即遇着最大值就不能再延伸,即用單調棧可以實現。
T3:1.要想涉及到數字的大部分都是數論,不要因爲暴力苟且得分就不想數論了。

需要保持的:
T3:打表找規律,然後迭代加深,卡時倒推。考試暴力ac也是奇蹟呀(既然想到倒退爲啥還沒想到gcd?還是對算法不夠熟悉呀)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章