[BOJ][1038]減少した数
1327 ワード
質問する
問題のソース
トラブルシューティングポリシー
まず一定の法則性を見つけなければならない.
0
1
2
3
4
5
6
7
8
9
10
20
21
30
31
32
40
41
42 - 18
43 19
44 20
50 21
51 22
52 23
53 24
54 25
.
.
.
.
210
321
310
320
このパターンだけを見ると、前の列の数字は前に計算した数字に1桁増加し、残りの数字は%10に分けられます.
したがって,動的プログラミングにより,前に記録した数字に10を乗じ,1のビット数を内輪に増やすだけでよい.
コード#コード#
#include <iostream>
#define N 1000001
using namespace std;
typedef long long ll;
ll num[N];
int main()
{
int n;
cin >> n;
int ni = 10;
for (int i = 0; i <= 9; i++)
num[i] = i;
for (int i = 1; i <= n; i++)
{
for (int j = 0; j < (num[i] % 10); j++)
{
num[ni++] = num[i] * 10 + j;
}
}
if (n > 1022)
cout << "-1\n";
else
cout << num[n] << '\n';
}
私は自分の力でコードを書くのが難しいので、他の人のコードを見て比較しました.ゴールドレベルの問題ではなく、公式で規則性を表現するのに慣れていないようです!
Reference
この問題について([BOJ][1038]減少した数), 我々は、より多くの情報をここで見つけました
https://velog.io/@easttwave/BOJ1038-감소하는수
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
#include <iostream>
#define N 1000001
using namespace std;
typedef long long ll;
ll num[N];
int main()
{
int n;
cin >> n;
int ni = 10;
for (int i = 0; i <= 9; i++)
num[i] = i;
for (int i = 1; i <= n; i++)
{
for (int j = 0; j < (num[i] % 10); j++)
{
num[ni++] = num[i] * 10 + j;
}
}
if (n > 1022)
cout << "-1\n";
else
cout << num[n] << '\n';
}
Reference
この問題について([BOJ][1038]減少した数), 我々は、より多くの情報をここで見つけました https://velog.io/@easttwave/BOJ1038-감소하는수テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol