題目傳送門
真是個毒瘤題
一開始想這是乙個多重揹包板子題,於是不假思索打了上去,樣例沒過,再一看題,原來不是(又眼瞎了)
於是再次認真讀題
很顯然我們可以發現:如果給定硬幣最小面額大於1,那麼就一定輸出no answer!!!因為首先**為1的就組成不了。
接著思考,假設第i種硬幣已用最小硬幣數ans組成最大可行**tot,
那麼如果tot>=a[i+1]-1,那麼可以直接i++;否則累加,tot+=a[i],直到tot>=a[i+1]-1;同時每次ans++。
因為這是個累加,資料範圍又大,所以容易被卡。於是我們要用一步下=小除法:k=(a[i+1]-2-tot)/a[i]+1,這裡的k是加k個a[i]可以滿足條件,就不用乙個個加了。
最後注意一點如果tot剛好等於m−1 ,並結束了迴圈,此時我們要在迴圈外輸出 ans+1, 特判一下。
ac**
#include
using
namespace std;
long
long n,m,a[
2000005
],ans,tot;
intmain()
a[n+1]
=m;for
(int i=
1;i<=n;i++)}
} cout
}
最後 洛谷P2001 硬幣的面值
其實這道題就按照題面意思直接模擬一下就好喇!很顯然如果給定硬幣的最小值大於1則輸出 no answer 因為這樣子就無法取到1這個面值了。先證明一下這一點 如果目前狀態可取前 x xx 且當前取了乙個面額為 a aa 的硬幣,要想構成前 x a x a x a 的所有 必須僅當 x a 1 x ge...
洛谷 P2708 硬幣翻轉
時間限制1.00s 記憶體限制125.00mb 從前有很多個硬幣擺在一行,有正面朝上的,也有背面朝上的。正面朝上的用1表示,背面朝上的用0表示。現在要求從這行的第乙個硬幣開始,將前若干個硬幣一起翻面,問如果要將所有硬幣翻到正面朝上,最少要進行這樣的操作多少次?乙個字串,由0和1組成,表示硬幣狀態 乙...
洛谷P1146 硬幣翻轉
時間限制 1.00s 記憶體限制 125.00mb 題目描述在桌面上有一排硬幣,共nn枚,每一枚硬幣均為正面朝上。現在要把所有的硬幣翻轉成反面朝上,規則是每次可翻轉任意n 1n 1枚硬幣 正面向上的被翻轉為反面向上,反之亦然 求乙個最短的操作序列 將每次翻轉n 1枚硬幣成為一次操作 輸入格式 乙個自...