[关闭]
@himnouth 2022-07-27T07:38:25.000000Z 字数 979 阅读 276

题解

Atcoder Beginner Contest 257 problem E 题解

题目链接:______

题目大意

高桥有一个整数。最初,=0。高桥可以多次执行以下操作:

高桥的预算是日元。在不超过预算的情况下,找出最终x的最大可能值。

数据范围

样例输入1

  1. 5
  2. 5 4 3 3 2 5 3 5 3

样例输出1

  1. 95

样例解释1

按照的顺序进行操作,再按照的顺序进行操作,会发生以下变化。

支付的总金额为日元,不超过预算。答案是95,因为它可以证明通过不超出预算的操作方法不可能做出96或更大的整数。

样例输入2

  1. 20
  2. 1 1 1 1 1 1 1 1 1

样例输出2

  1. 99999999999999999999

解析

本题使用贪心算法解题。
假设此人共支付次,通过观察可知,其实际上所得的数必然是一个位数。因此,此题可转化为:使用日元,组成一个位数,使得总花销不超过的情况下,组成的数最大。
通常情况下,数的位数越多,则数越大,即越大,则更大。所以,无论是否花完预算,组成的数都必然会存在最大的位数,最优解的位数必然等于最大的位数,其必然等于:

因此,我们可先求出该数最多的位数,再用贪心算法从大到小枚举每一位,从而求出最优解。

代码实现

以上算法代码实现如下:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define N 1000000
  4. using ll=long long;
  5. int n,c[10],ans[N],min_c=0x3f3f3f3f;
  6. int main(){
  7. std::ios::sync_with_stdio(0);
  8. cin>>n;
  9. for(int i=1;i<=9;i++) cin>>c[i],min_c=min(min_c,c[i]);
  10. int cnt=n/min_c,n_=n;
  11. for(int i=1;i<=cnt;i++){
  12. for(int j=9;j>=1;j--){
  13. if(c[j]+(cnt-i)*min_c<=n_){
  14. ans[i]=j,n_-=c[j];
  15. break;
  16. }
  17. }
  18. }
  19. for(int i=1;i<=cnt;i++) cout<<ans[i];
  20. return 0;
  21. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注