Comet OJ - Contest #15

https://cometoj.com/contest/79/problem/D?problem_id=4219ios

題目描述c++

※ 簡單版與困難版的惟一區別是粗體字部份和 $v$ 的數據範圍。spa

在雙 11 時,心慧精品店有個特別的折價活動以下:code

首先,咱們定義一個正整數爲"好的"當且僅當此數僅由數字 1 構成,舉例來講 11111111111 都是「好的」,但 10123321 都是「很差的」。blog

接着,若一個商品原價爲 x,若顧客能把 x 表示爲 k 個「好的」數字,那麼此顧客就能用 k 元買下它。ci

小月在心慧精品店裏看上了一件原價爲 v 的商品,請輸出小月最少須要花多少錢才能買下此商品。get

 題解it

由於求由構成數x的最小數字,將問題轉換爲 x*9 由 9, 99 構成的數,令 u = 9*x, ans爲最小個數,因此 u + ans 的 10 的冪和,so u + x 是10的倍數且位數和dig_num <= ans且u + x > 10*x,io

而後暴力枚舉瞎搞就行了class

#include<bits/stdc++.h>
#define rep(i, n) for(int i=0;i!=n;++i)
#define per(i, n) for(int i=n-1;i>=0;--i)
#define Rep(i, sta, n) for(int i=sta;i!=n;++i)
#define rep1(i, n) for(int i=1;i<=n;++i)
#define per1(i, n) for(int i=n;i>=1;--i)
#define Rep1(i, sta, n) for(int i=sta;i<=n;++i)
#define L k<<1
#define R k<<1|1
#define inf (0x3f3f3f3f)
#define llinf (1e18)
#define mid (tree[k].l+tree[k].r)>>1
#define ALL(A) A.begin(),A.end()
#define SIZE(A) ((int)A.size())
typedef long long i64;
using namespace std;
const int MAX_LEN = 1000010;
char str[MAX_LEN];
void solve()
{
    str[0] = 0; scanf("%s",str+1);
    int len = strlen(str+1),dig_num = 0;
    for(int i=1;i<=len;++i)
        str[i] = (str[i] - '0')*9;
    for(int i=len;i>0;--i){
        str[i-1] += str[i] / 10;
        str[i] %= 10;
        dig_num += str[i];
    }
    dig_num += str[0];
    int ans = 10 - str[len];
    str[len] += ans;
    dig_num += ans;
    while(true){
        for(int i=len;i>0;--i){
            if(str[i] >= 10){
                dig_num -= 9;
                str[i] -= 10;
                ++str[i-1];
            }else
                break;
        }
        if(dig_num <= ans){
            cout << ans <<'\n';
            return;
        }
        ans += 10;
        dig_num += 10;
        str[len] += 10;
    }
}
int main() {
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int T;  scanf("%d",&T);
    while(T--)  solve();    
    return 0;
}
相關文章
相關標籤/搜索