@himnouth
2022-07-27T07:38:25.000000Z
字数 979
阅读 276
题解
题目链接:______
高桥有一个整数。最初,=0。高桥可以多次执行以下操作:
高桥的预算是日元。在不超过预算的情况下,找出最终x的最大可能值。
55 4 3 3 2 5 3 5 3
95
按照的顺序进行操作,再按照的顺序进行操作,会发生以下变化。
支付的总金额为日元,不超过预算。答案是95,因为它可以证明通过不超出预算的操作方法不可能做出96或更大的整数。
201 1 1 1 1 1 1 1 1
99999999999999999999
本题使用贪心算法解题。
假设此人共支付次,通过观察可知,其实际上所得的数必然是一个位数。因此,此题可转化为:使用日元,组成一个位数,使得总花销不超过的情况下,组成的数最大。
通常情况下,数的位数越多,则数越大,即越大,则更大。所以,无论是否花完预算,组成的数都必然会存在最大的位数,最优解的位数必然等于最大的位数,其必然等于:
因此,我们可先求出该数最多的位数,再用贪心算法从大到小枚举每一位,从而求出最优解。
以上算法代码实现如下:
#include<bits/stdc++.h>using namespace std;#define N 1000000using ll=long long;int n,c[10],ans[N],min_c=0x3f3f3f3f;int main(){std::ios::sync_with_stdio(0);cin>>n;for(int i=1;i<=9;i++) cin>>c[i],min_c=min(min_c,c[i]);int cnt=n/min_c,n_=n;for(int i=1;i<=cnt;i++){for(int j=9;j>=1;j--){if(c[j]+(cnt-i)*min_c<=n_){ans[i]=j,n_-=c[j];break;}}}for(int i=1;i<=cnt;i++) cout<<ans[i];return 0;}