A36 贪心算法 P5020 [NOIP2018 提高组] 货币系统
视频链接:86 贪心算法 [NOIP2018 提高组] 货币系统_哔哩哔哩_bilibili
Luogu P5020 [NOIP2018 提高组] 货币系统
#include<cstring> #include<iostream> #include<algorithm> using namespace std; int n,a[105],f[25005],ans; //f[j]表示j能被已知数字拼凑的方案数 int main(){ int T; scanf("%d",&T); while(T--){ scanf("%d",&n); for(int i=1; i<=n; i++) scanf("%d",&a[i]); sort(a+1,a+n+1); memset(f,0,sizeof(f)); f[0]=1; for(int i=1; i<=n; i++) for(int j=a[i];j<=a[n];j++) f[j]+=f[j-a[i]]; ans=0; for(int i=1;i<=n;i++) if(f[a[i]]==1) ans++; printf("%d\n",ans); } }
#include<cstring> #include<iostream> #include<algorithm> using namespace std; int n,a[105],f[25005],ans; int main(){ int T; scanf("%d",&T); while(T--){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); sort(a+1,a+n+1); memset(f,-63,sizeof f); f[0]=0; for(int i=1;i<=n;i++) for(int j=a[i];j<=a[n];j++) f[j]=max(f[j],f[j-a[i]]+1); ans=0; for(int i=1;i<=n;i++) if(f[a[i]]==1) ans++; printf("%d\n",ans); } return 0; }
Luogu P3951 [NOIP2017 提高组] 小凯的疑惑
设 a<b,答案为 x
若 x≡ma(mod b) (1≤m≤b−1)
即 x=ma+nb (1≤m≤b−1)
当 n≥0 时,x 可以用 a,b 表示出来,不合题意。
因此当 n=−1 时 x 取得最大值,此时 x=ma−b。
显然当 m 取得最大值 b−1 时,x 最大,
此时 x=(b−1)a−b=ab−a−b。
#include <iostream> using namespace std; int main(){ long long a,b; cin>>a>>b; cout<<a*b-a-b<<endl; return 0; }