2026/4/6 2:14:53
网站建设
项目流程
网站托管服务适用于,网站开发用什么技术,百度登录页,北京社招网站CF767E-Change-free
题目大意
你接下来 nnn 天回去食堂吃饭#xff0c;而且现在你已经决定好了吃什么#xff0c;所以你在接下来的第 iii 天#xff0c;花费 cic_ici 元。
交易时只允许使用 111 元的硬币和 100100100 元的纸币#xff0c;你初始有 mmm 硬币和无限多的…CF767E-Change-free题目大意你接下来n nn天回去食堂吃饭而且现在你已经决定好了吃什么所以你在接下来的第i ii天花费c i c_ici元。交易时只允许使用1 11元的硬币和100 100100元的纸币你初始有m mm硬币和无限多的纸币。在其中的某些天你可能不够正好支付c i c_ici元所以会面临找零。但是收银员在找零时会产生不满。如果收银员在第i ii天找了x xx纸币和硬币。那么会产生x ⋅ w i x \cdot w_ix⋅wi点不满。收银员总是尽量用最少的硬币和纸币找零。你希望使得收银员总不满尽可能小。你需要确认在接下来n nn天的最小总不满和如何支付的方案。题解考虑贪心现在手上有的硬币如果满足当天所需则尽可能使用。否则就找到在此之前不满程度最小的一天来找零。对于被找零的那天本身花了c i % 100 c_i \% 100ci%100元现在不仅没花而且获得了100 − c i % 100 100-c_i \% 100100−ci%100元所以一次找零的贡献是固定的100 100100。因此对于每一天来说都有一个固定的不满和一样的贡献。所以用优先队列维护不满最小值。每次取最小值即可。#includebits/stdc.h#defineiosios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#defineumapunordered_map#defineendl\nusingnamespacestd;usingi128__int128;constintmod1e97;templatetypenameTvoidread(Tx){x0;intf1;charcgetchar();for(;!isdigit(c);cgetchar())if(c-)f-1;for(;isdigit(c);cgetchar())x(x1)(x3)(c^48);x*f;}templatetypenameTvoidprint(T x){if(x0){putchar(-);x-x;}if(x9)print(x/10);putchar(x%100);}#defineintlonglongconstintN500005;constintM2000005;mapint,intans;inlinevoidsolve(){ans.clear();intn,m;cinnm;vectorintnum(n1);for(inti1;in;i){cinnum[i];}vectorintw(n1);for(inti1;in;i)cinw[i];priority_queuepairint,int,vectorpairint,int,greaterpairint,intq;intcost0;for(inti1;in;i){if(num[i]%1000)continue;q.push({(100-(num[i]%100))*w[i],i});if(mnum[i]%100){m100;costq.top().first;ans[q.top().second];q.pop();}m-num[i]%100;// coutmendl;}coutcostendl;for(inti1;in;i){if(ans[i]){coutnum[i]/1001 0endl;}else{coutnum[i]/100 num[i]%100endl;}}}signedmain(){ios;intT1;// cinT;for(;T--;)solve();return0;}