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;
    }
比赛题解 文章被收录于专栏

近期比赛的题解应该有吧。。。

全部评论

相关推荐

头像
10-22 19:18
上海大学 后端
jopajhhdjwnqk:水印都叠杀人书了
点赞 评论 收藏
分享
8 收藏 评论
分享
牛客网
牛客企业服务