1. 程式人生 > >洛谷P2001 硬幣的面值 題解

洛谷P2001 硬幣的面值 題解

題目連結:https://www.luogu.org/problemnew/show/P2001

這題的資料範圍嚇得我很慌。

分析:

這道題蒟蒻本來想用揹包的,但是發現m太大,一寫肯定炸,然後看到資料範圍表示成了 2 63 2^{63} ,馬上想到了可以二進位制轉化一下,然後又寫炸了(我太弱了 ),只能換成如下思路,

程式碼:

#include<algorithm>
#include<iostream>
#include<cstdio>
using namespace std;
long long n,m,sum,ans,a[2000001];      //都打成ll保險!        
int main()
{
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=n;++i)
    scanf("%lld",&a[i]);
    a[n+1]=m;                   
    sort
(a+1,a+1+n+1); if(a[1]!=1)//排序後沒有1?騙誰,連1都表示不出來了,沒答案! { printf("No answer!!!\n"); return 0; } for(int i=1;i<=n;++i) { while(sum<a[i+1]-1) //貪心的思想 { sum+=a[i]; ans++; if
(sum>=m) { printf("%lld\n",ans); return 0; } } } printf("%lld\n",ans+1);最後別忘了+1, return 0; }