AtCoder初心者コンテスト161 D Lunlun Numberプレイテーブル+ルールを見つける+構造

AtCoder Beginner Contest 161 出場者の   数は9927人   で、コンテスト開始5分後にすべての質問をご覧ください

AtCoder初心者コンテスト161 D Lunlun Numberプレイテーブル+ルールを見つける+構造

一般的なカタログについては、https://blog.csdn.net/mrcrack/article/details/104454762を参照してください

オンライン評価用アドレスhttps://atcoder.jp/contests/abc161/tasks/abc161_d

この種の問題である手動シミュレーションは、何千ものデータ、つまり計測に対応しており、データエラーのシミュレーションは容易ではありません。

テーブルコードは以下の通りです

#include <cstdio>
#include <algorithm>
#define LL long long
using namespace std;
int a[15];
int judge(LL x){
	int i,top=0;
	while(x){
		a[++top]=x%10;
		x/=10;
	}
	for(i=2;i<=top;i++)
		if(abs(a[i]-a[i-1])>1)return 0;
	return 1;
}
int main(){
	int cnt=0;
	LL i,n;
	scanf("%lld",&n);
	for(i=1;i<=n;i++)
		if(judge(i))cnt++,printf("%lld,",i);
	printf("\ncnt=%d\n",cnt);
	return 0;
}

テーブルコードをコンパイルして実行し、9999と入力して、次の出力データを取得します。

1,2,3,4,5,6,7,8,9,
10,11,12,
21,22,23,
32,33,34,
43,44,45,
54,55,56,
65,66,67,
76,77,78,
87,88,89,
98,99,
100,101,
110,111,112,
121,122,123,
210,211,212,
221,222,223,
232,233,234,
321,322,323,
332,333,334,
343,344,345,
432,433,434,
443,444,445,
454,455,456,
543,544,545,
554,555,556,
565,566,567,
654,655,656,
665,666,667,
676,677,678,
765,766,767,
776,777,778,
787,788,789,
876,877,878,
887,888,889,
898,899,
987,988,989,
998,999,
1000,1001,
1010,1011,1012,
1100,1101,
1110,1111,1112,
1121,1122,1123,
1210,1211,1212,
1221,1222,1223,
1232,1233,1234,
2100,2101,
2110,2111,2112,
2121,2122,2123,
2210,2211,2212,
2221,2222,2223,
2232,2233,2234,
2321,2322,2323,
2332,2333,2334,
2343,2344,2345,
3210,3211,3212,
3221,3222,3223,
3232,3233,3234,
3321,3322,3323,
3332,3333,3334,
3343,3344,3345,
3432,3433,3434,
3443,3444,3445,
3454,3455,3456,
4321,4322,4323,
4332,4333,4334,
4343,4344,4345,
4432,4433,4434,
4443,4444,4445,
4454,4455,4456,
4543,4544,4545,
4554,4555,4556,
4565,4566,4567,
5432,5433,5434,
5443,5444,5445,
5454,5455,5456,
5543,5544,5545,
5554,5555,5556,
5565,5566,5567,
5654,5655,5656,
5665,5666,5667,
5676,5677,5678,
6543,6544,6545,
6554,6555,6556,
6565,6566,6567,
6654,6655,6656,
6665,6666,6667,
6676,6677,6678,
6765,6766,6767,
6776,6777,6778,
6787,6788,6789,
7654,7655,7656,
7665,7666,7667,
7676,7677,7678,
7765,7766,7767,
7776,7777,7778,
7787,7788,7789,
7876,7877,7878,
7887,7888,7889,
7898,7899,
8765,8766,8767,
8776,8777,8778,
8787,8788,8789,
8876,8877,8878,
8887,8888,8889,
8898,8899,
8987,8988,8989,
8998,8999,
9876,9877,9878,
9887,9888,9889,
9898,9899,
9987,9988,9989,
9998,9999,
cnt=327

研究のための特別なデータを選ぶ

98,99,
100,101,
898,899,
998,999,
1000,1001,
1100,1101,
2100,2101,
7898,7899,
8898,8899,
8998,8999,
9898,9899,
9998,9999,

データ生成プロセスを示す例として8、9、10を取り上げます

8生成的2位数有87,88,89
9生成的2位数有98,99
10生成的2位数有100,101

其它数据生成过程,不外乎上述三种过程。

データ生成プロセスに精通した後、質問の意図を満たす100,000セットのデータを作成し、テストするデータを選択します。

ACコードは以下の通りです

#include <stdio.h>
#define maxn 100010
#define LL long long
LL rd[maxn]={1,2,3,4,5,6,7,8,9};
int main(){
	int i,id,k;
	scanf("%d",&k);
	i=9,id=0;
	while(i<k){
		if(rd[id]%10==0){//10生成的2位数有100,101
			rd[i]=rd[id]*10;
			rd[i+1]=rd[id]*10+1;
			i+=2;
		}else if(rd[id]%10==9){//9生成的2位数有98,99
			rd[i]=rd[id]*10+8;
			rd[i+1]=rd[id]*10+9;
			i+=2;
		}else{//8生成的2位数有87,88,89
			rd[i]=rd[id]*10+rd[id]%10-1;
			rd[i+1]=rd[id]*10+rd[id]%10;
			rd[i+2]=rd[id]*10+rd[id]%10+1;
			i+=3;
		}
		id++;
	}
	printf("%lld\n",rd[k-1]);
	return 0;
}

 

元の記事を660件公開 562 件を賞賛 48万回の閲覧

おすすめ

転載: blog.csdn.net/mrcrack/article/details/105322122