給定n個選手,將他們分成若干只隊伍。其中第i個選手要求自己所屬的隊伍的人數大等於a[i]人。
在滿足所有選手的要求的前提下,最大化隊伍的總數。
注:每個選手屬於且僅屬於一支隊伍。
第一行乙個整數n,表示人數。
以下n行,每行乙個整數表示a[i]。
輸出隊伍總數的最大值。資料保證有解。輸入5
2122
3輸出對於20%的資料,n <= 10
對於40%的資料,n <= 1000
對於60%的資料,n <= 10000
對於100%的資料,1 <= n <= 10^6
最開始一看,誒,這不就是個貪心嘛,結果就只拿了50分。不過機房裡的大佬,有的貪心貪了80分,還有乙個貪到100分的,也不知道是怎麼貪出來的。。。拿100分大佬的貪心和我後面寫的dp去拍,拍到了4萬多還是沒有錯誤。(太巨了!!)
但這題貪心顯然是不可行的。
最開始的貪心**如下,
int
main()
}printf
("%d\n"
,sum)
;return0;
}
就是從後往前,把麻煩的堆在一起,本來樣例都過了,結果後面發現乙個錯誤資料。。。
錯誤資料輸入9
1224
5555
5正確輸出
解釋三組分別為(1)(2,2)(4,5,5,5,5,5)
我的輸出
錯誤原因
從後往前分的貪心,並不能聰明到把4歸進後一組,而是會讓4自己新開一組,於是分組結果如下:(1,2,2,4)(5,5,5,5,5)
既然貪心是不行的,那就讓我們來試試dp。後面寫dp的時候也是充滿坎坷啊。。。
知道了是dp之後,其實轉移方程還算是蠻好找的。
for
(int i =
1; i <= n; i ++
)
然後,最煩的就是要加乙個特判,如果最麻煩的那個人要求特高的話,那就整個只能全在一組裡了。特判**如下,
if
(n - a[n]==0
)
超級注釋版**(from 巨佬 zwt)
最後,附贈實驗巨佬zwt的超級注釋版**
#include
using
namespace std;
const
int maxn =
1000015
;//blt:最開始我maxn少寫了個0,結果交到某谷上只有60分。。。
int n, a[maxn]
, f[maxn]
, g[maxn]
;inline
intread()
//快讀優化
while
(ch >=
'0'&& ch <=
'9')
return x * f;
}int
main()
printf
("%d"
, f[n]);
//不知為啥輸出f??
//blt:這個為什麼我也不清楚
//blt:或者像我的最終版dp那樣加個特判也是能a的
return0;
}/*//也可直接:
f[i] = max ( f[ i - 1], f[i - a[ i] ] + 1)
f[ i - 1]第i個人不開新隊,最大分隊數不變
f[i - a[ i] ] + 1第i個人開新隊,最少保證後邊兒還有a[i]個人
sum = max(sum, f[i])
↑錯的!!!
//錯誤資料:41
224 //blt:其實只是最終要記得加個特判。。。
改為:g[n] = f[i - a[ i] ] + 1
f[i] = max ( f[ i - 1], g[i])
輸出f[i]
↑還是錯的!!
//blt:其實這倆是 乙個效果,又沒有加特判,當然錯了啊
f[n]相當於標程中的g(預處理效果??),最後應輸出g[n]!!
//blt:我好像有些不明白。。。(坐看大佬zwt一本正經的胡亂bb)
再改:(對於加了一位反而所有加在一起都只能分一組的特判(?)
//blt:是這樣的呢
(迴圈內)
if(i - a[i] >= 0)
(迴圈外)
if(n - a[n] == 0)
f[n] = 1;
輸出f[n]
//blt:所以最後當然是a啦,啦啦啦~
*/
對於乙個數字對(a, b),我們可以通過一次操作將其變為新數字對(a+b, b)或(a, a+b)。
給定一正整數n,問最少需要多少次操作可將數字對(1, 1)變為乙個數字對,該數字對至少有乙個數字為n。
第一行乙個正整數 n
乙個整數表示答案。
輸入輸出
樣例解釋
(1,1) → (1,2) → (3,2) → (5,2)
對於30%的資料, 1 <= n <= 1000
對於60%的資料, 1 <= n <= 20000
對於100%的資料,1 <= n <= 10^6
這題超簡單的,其實就是乙個輾轉相除法的變形。具體解釋請詳見**,
#include
using
namespace std;
#define inf 1<<30
intread()
while
(ch >=
'0'&& ch <=
'9')
return ret * flag;
}int
magic
(int a,
int b)
int n;
int now = inf;
intmain()
printf
("%d\n"
,now)
;return0;
}
早苗入手了最新的高階打字機。最**自然有著與以往不同的功能,那就是它具備撤銷功能,厲害吧。
請為這種高階打字機設計乙個程式,支援如下3種操作:
t x:在文章末尾打下乙個小寫字母x。(type操作)
u x:撤銷最後的x次修改操作。(undo操作)(注意query操作並不算修改操作)
q x:詢問當前文章中第x個字母並輸出。(query操作)文章一開始可以視為空串。
第1行:乙個整數n,表示運算元量。
以下n行,每行乙個命令。保證輸入的命令合法。
每行輸出乙個字母,表示query操作的答案。輸入7
t at b
t cq 2
u 2t c
q 2輸出bc
對於40%的資料 n<=200;
對於100%的資料 n<=100000;保證undo操作不會撤銷undo操作。
對於200%的資料 n<=100000;undo操作可以撤銷undo操作。
大佬說:這不就是乙個簡單的主席樹板子嘛。然而本蒟蒻並沒有學過主席樹。。。
LeetCode刷題之旅(Day4)
給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0 示例 2 nums1 1,2 ...
中軟實習 day4總結
從html被發明開始,樣式就以各種形式存在。不同的瀏覽器結合它們各自的樣式語言為使用者提供頁面效果的控制。最初的html只包含很少的顯示屬性。隨著html的成長,為了滿足前端工程的需求,html增加了很多顯示功能,html變得混亂,html頁面顯得用臃腫,於是css誕生了 css cascading...
湖南集訓Day4
上午的數論感覺還可以,嗯,感覺。因為畢竟我數學弱,只聽懂一半什麼的,感覺證明還是比較顯然的。話說這金牌爺長得好像我某物理老師啊 下午的題終於不是clj出的了,沒辣麼虐了。第一題疑似回文自動機,然而並不會,於是dp水了60分。第二題想了下應該是樹鏈剖分,然後發現搞不出來,回去水第一題,然後水完回來繼續...