1 条题解
-
0
自动搬运
来自洛谷,原作者为

zjc5
zjc搬运于
2025-08-24 22:51:52,当前版本为作者最后更新于2024-08-21 19:54:08,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
思路:
设 是用 凑出小于 的面额所用最大纸币数, 表示符合此条件的最小值。
设 。
- ,显然 。
- ,则所有 的纸币数必然小于 ,即小于等于 ,而 刚好对应 。
综上所述,$mx_i=\lfloor\frac{a_{i+1}-mx_{i-1}-1}{a_i}\rfloor a_i+mx_{i-1}$。
注意到若 的系数不能为零,则选出的 必须满足 。
查询答案时二分查找到满足 的最大的 ,求答案的过程与预处理类似。
时间复杂度:
因为 所以 ,又因为 则 。
所以总时间复杂度是 。
#include<bits/stdc++.h> #define int long long using namespace std; const int N=200010; int n,t,b[N],a[N],q,x,f[N],mx[N]; signed main(){ cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; a[n+1]=2e18; for(int i=1;i<=n;i++){ if(a[i]+mx[t]<a[i+1]){ b[++t]=a[i]; f[t]=f[t-1]+(a[i+1]-mx[t-1]-1)/b[t]; mx[t]=(a[i+1]-mx[t-1]-1)/b[t]*b[t]+mx[t-1]; } } cin>>q; while(q--){ cin>>x; int p=upper_bound(b+1,b+t+1,x)-b-1; x=min(x,mx[p]); cout<<mx[p-1]+(x-mx[p-1])/b[p]*b[p]<<" "<<f[p-1]+(x-mx[p-1])/b[p]<<"\n"; } return 0; }
- 1
信息
- ID
- 9352
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 5
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者