作者:储兰兰快乐 | 来源:互联网 | 2023-10-10 21:38
题目链接题意Arseny有m个1元硬币,无限多100元钞票,他要按顺序买n个东西第i天如果找零x个硬币,他的不满值会加w[i]*x,求最少不满值.题解若找零,则硬币增加100-ci
题目链接
题意
Arseny有m个1元硬币, 无限多100元钞票, 他要按顺序买n个东西
第i天如果找零x个硬币, 他的不满值会加 w[i]*x, 求最少不满值.
题解
若找零, 则硬币增加 100-ci%100, ans增加(100-ci%100)*wi
不找零, 则硬币增加 -ci%100, ans不变
贪心尽量不找零, 如果需要找零, 可以发现更改任意一个均会增加100个硬币
所以直接选一个对ans贡献最少的改为找零即可
需要特判100的倍数, 一定不能找零
#include
#include
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N = 4e5+10, INF = 0x3f3f3f3f;
int n, m;
int c[N], w[N];
int vis[N];
int main() {
cin>>n>>m;
REP(i,1,n) cin>>c[i];
REP(i,1,n) cin>>w[i];
priority_queue,greater > q;
ll ans = 0;
REP(i,1,n) if (c[i]%100) {
q.push(pii((100-c[i]%100)*w[i],i));
if (m100) {
vis[q.top().y] = 1;
m += 100;
ans += q.top().x;
q.pop();
}
m-=c[i]%100;
}
cout1,n) {
if (vis[i]) cout<100+1<<‘ ‘<<0<<‘\n‘;
else cout<100<<‘ ‘<100<<‘\n‘;
}
}
Change-free CodeForces - 767E