大意: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 <iostream>
#include <queue>
#include <cstdio>
#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+, INF = 0x3f3f3f3f;
int n, m;
int c[N], w[N];
int vis[N]; int main() {
cin>>n>>m;
REP(i,,n) cin>>c[i];
REP(i,,n) cin>>w[i];
priority_queue<pii,vector<pii>,greater<pii> > q;
ll ans = ;
REP(i,,n) if (c[i]%) {
q.push(pii((-c[i]%)*w[i],i));
if (m<c[i]%) {
vis[q.top().y] = ;
m += ;
ans += q.top().x;
q.pop();
}
m-=c[i]%;
}
cout<<ans<<endl;
REP(i,,n) {
if (vis[i]) cout<<c[i]/+<<' '<<<<'\n';
else cout<<c[i]/<<' '<<c[i]%<<'\n';
}
}