码迷,mamicode.com
首页 > 其他好文 > 详细

Change-free CodeForces - 767E

时间:2019-01-05 19:57:08      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:def   ios   out   顺序   ++i   cin   color   code   题意   

题目链接

 

题意

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>
#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<pii,vector<pii>,greater<pii> > q;
    ll ans = 0;
    REP(i,1,n) if (c[i]%100) {
        q.push(pii((100-c[i]%100)*w[i],i));
        if (m<c[i]%100) {
            vis[q.top().y] = 1;
            m += 100;
            ans += q.top().x;
            q.pop();
        }
        m-=c[i]%100;
    }
    cout<<ans<<endl;
    REP(i,1,n) {
        if (vis[i]) cout<<c[i]/100+1<< <<0<<\n;
        else cout<<c[i]/100<< <<c[i]%100<<\n;
    }
}

 

Change-free CodeForces - 767E

标签:def   ios   out   顺序   ++i   cin   color   code   题意   

原文地址:https://www.cnblogs.com/uid001/p/10225586.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!