儘管這些題目都是***的經典歌曲,但和***毫無關係(好歹說一句:小明正在聽***的歌《知足》,突然心情很差,想出了一道機智的題,希望機(yu)智(chun)的你去切(bu cun zai de)了他。
你現在正在設計一套新的貨幣系統。這套貨幣系統有以下要求:
一共有 k
'>k
種面值的紙幣(沒有硬幣等其他貨幣)。
最小的紙幣面值為 1
'>1
元。每種紙幣的面值為前一種紙幣面值的 2
'>2
或 3'>3
或 4'>4
或 5'>5
倍。現在你希望設計這樣一套貨幣系統,使得湊出 n
'>n
元所需的紙幣數量盡量少(注意這裡不設找零,即你只能拿若干張紙幣加起來湊出 n
'>n
元)。你可以假設每種面值的紙幣都有任意多張。輸入一行兩個正整數 n
'>n
和 k'>k
,以乙個空格隔開。輸出乙個正整數,表示湊出 n
'>n
元至少需要的紙幣數量。
1025 6
2
紙幣面值:1
'>1
, 4'>4
, 16
'>16
, 64
'>64
, 256
'>256
, 1024
'>1024
。子任務1(20分):n≤10
18,k≤
10'>n
≤10^18,
k≤10子任務2(80分):n≤10
18,k≤
100'>n
≤10^18,
k≤100感覺智商越來越低了,,動態開點線段樹被做成單調佇列,nuo,普及組的題都只能敲暴力,orz orz
20分做法,爆搜。
滿分做法:dp[n,k]表示,還可以新有k種貨幣,將這k+1種貨幣構成n元錢的最小紙幣張數,並且第k+1的面額為1。
有個很顯然的貪心我們也在上述20分爆搜寫的時候發現,在一組貨幣後,我們一定是優先選金額大的再選金額小的。而這裡,我們列舉一下一張貨幣的面額(從2-->5)d,那麼一定是後面的貨幣分配了n-n%d元,這樣才更優。由於那n%d太小,只有面額1能選便分配。
這樣之後看似我們與之前定的面額矛盾,因為現在變成了k+1面額為d了。但實際上我們如果將(n-n%d)和面額d同時除上乙個d,那麼我們就又轉化為之前的dp狀態了。
那麼就有 dp[n,k] = for ( d 2-->5) min(dp[n,k],dp[(n-n%d)/d,k-1]+n%d)
這裡面有很多冗餘狀態,且顯然陣列存不下。我們開個hash表或者map都是可以的。
code:
#include#include#include#includeusing namespace std;mapdp[105];
long long n,k;
long long dfs(long long n,long long k)
return dp[k][n] = bbest;
}int main()
中山DAy2 普及
今天挺不友好的,早上忘記定鬧鐘,晚了半小時起床,然後早上信心滿滿打算弄他個300分。結果 132.2分 wtf?題意 有n頭奶牛,k種細菌 k 15 給你每頭奶牛攜帶的細菌種類,問 若讓選出所有奶牛攜帶細菌少於d種,最多選幾頭奶牛?思路 上手就用了動歸,可能是昨天打積木那題,自己信心爆棚。然後 神奇...
嵊州普及Day2T2
題意 對於n個數的數列,進行排列,求第m個大於此數列的數列。思路 查詢後2個是否逆序,若是,將後3個遞迴。如此運算,找後面大於此數中最小數交換,然後將後面數列順序排列。相對簡單。見 include include include include include using namespace std...
JZOJ Day 2 普及模擬 串
題目描述 給定乙個0 1串,請找到乙個盡可能長的子串,其中包含的0與1的個數相等。輸入乙個字串,只包含01,長度不超過1000000。輸出 一行乙個整數,最長的0與1的個數相等的子串的長度。樣例輸入 1011 樣例輸出 2 資料範圍限制 30 的資料 串的長度 20 程式 var s ansistr...