https://cometoj.com/contest/79/problem/D?problem_id=4219
タイトル説明
※シンプルかつ困難なバージョンのバージョンの唯一の違いは太字の部分と$ V $データの範囲内です。
ダブル11、心ホイブティックが特別割引を持っているときに活動は次の通りです:
まず、我々は正の整数が「良い」場合に限りのみによってこの番号デジタルで定義し
1
、例えば構成1
、11
、111
、11111
「良い」であるが10
、123
、321
である「悪いです」。商品の元の価格がXであれば、顧客はX kの「良い」数として表現することができるならばその後、場合、顧客は、k個の元でそれを購入することができるようになります。
さつきの心ホイブティックは、商品Vの元の価格を発見し、さつきの出力は、この製品を購入するために最低限の支出多くのお金を必要としてください。
問題の解決策
最小数uは9 * X =よう、構成される* 9 9 X 99に多くの問題を変換するように構成され、ANS最小数、U + ANSのパワーと10、UにX番号によって必要とされるため、+ xは10の倍数と中央値とdig_numある<= ANSおよびu + X> 10 * X
そして、暴力の列挙だけで結構いじり
#include <ビット/ STDC ++ H> の#define担当者(I、N)のためには、(INT iは= 0; i = N;!++ I) の#define当たり(I、N)のための(INT I = N-1; I> = 0; - I) の#define議員(I、STA、n)は(int型I = STAの; I = N; ++ I)! の#define REP1(I、N)は、i = 1の(int型のため、 I <= N; ++ I) の#define PER1(I、N)のための(INT I = N; I> = 1; - I) の#define REP1(I、STA、N)のための(INT I = STA。 I <= N; ++ I) の#define LのK << 1個 の#define R K << 1 | 1 の#define INF(0x3f3f3f3f) の#define llinf(1E18) の#define中間(ツリー[K] .L +ツリー[ K] .R)>> 1 の#define ALL(A)A.begin()、A.end() の#define SIZE(A)((INT)A.size()) のtypedef 長いです 長いI64; 使用して 名前空間はstdを、 const int型 MAX_LEN = 1000010 ; チャーSTR [MAX_LEN]。 ボイド(解決) { STR [ 0 ] = 0 ; scanf関数(" %S "、STR + 1 )。 INT LEN = STRLEN(STR + 1)、dig_num = 0 。 以下のために(int型私は= 1 ; I <= LEN; ++ I) STR [I] =(STR [I] - ' 0 ')* 9 。 用(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; 一方、(真){ ため(INT I = LEN; I> 0 ; - I){ 場合(STR [I]> = 10 ){ dig_num - = 9 。 STR [I] - = 10 。 ++ STR [I- 1 ]。 } エルス ブレーク。 } IF(dig_num <= ANS){ coutの << ANS << ' \ n個' ; リターン; } 年 + = 10 ; dig_num + = 10 。 P [だけ] + = 10 。 } } INT メイン(){ イオス:: sync_with_stdio(偽); cin.tie(0)。cout.tie(0 )。 int型 T; scanf関数(" %のD "、&T)。 一方、(T-- )(解きます)。 リターン 0 ; }