https://cometoj.com/contest/79/problem/D?problem_id=4219ios
題目描述c++
※ 簡單版與困難版的惟一區別是粗體字部份和 $v$ 的數據範圍。spa
在雙 11 時,心慧精品店有個特別的折價活動以下:code
首先,咱們定義一個正整數爲"好的"當且僅當此數僅由數字
1
構成,舉例來講1
,11
,111
,11111
都是「好的」,但10
、123
、321
都是「很差的」。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; }