2020牛客国庆集训派对day5 D
Exact Measurement
https://ac.nowcoder.com/acm/contest/7852/D
分析
可以观察到,如果一个数的最小位数没法精准划分,那么再多的大位也不可能表达出这个数字。所以我们考虑从低位到高位依次贪心。
对一位的答案可以贪心考虑。如果 ,那么在同一位上的我们显然是考虑 是要比 更优的,那么当我们可以得到一个值 而且可以得到 那么我们是可以确定这一位的。
那么由小到大依次考虑就可以了,而且多余的答案不能去掉,因为要考虑进位。
代码
#include<bits/stdc++.h> using namespace std; #define ll long long const int N = 1e6 + 10; #define pii pair<ll,ll> ll read() {ll x;scanf("%lld",&x);return x;} ll Pow[N],val[N],L; vector<int> ans; vector<pii> s[21]; priority_queue<pii> heap; int main() { ll n = read(),m = read(); ll x = n; for(int i = 1;i <= m;i++) { ll a = read(),b = read(); s[a].push_back(pii(b,i)); } int len = 0; while(x) val[L++] = x % 10,x /= 10; Pow[0] = 1;for(int i = 1;i <= 18;i++) Pow[i] = Pow[i - 1] * 10ll; bool flag = 0;ll res = 0; for(int i = 0;i < L;i++) { ll tot = val[i] * Pow[i]; for(auto e : s[i]) heap.push(pii(e.first * Pow[i],e.second)); while(heap.size() && res < tot) { res += heap.top().first; ans.push_back(heap.top().second); heap.pop(); } if(res < tot) {printf("-1\n");return 0;} res -= tot; } sort(ans.begin(),ans.end());printf("%d\n",ans.size()); for(auto e : ans) printf("%d ",e);return 0; }
比赛题解 文章被收录于专栏
近期比赛的题解应该有吧。。。