luogu 11.8 队内赛 暴力T1 Lyrith -迷宮リリス-

Posted SSL_ZZL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luogu 11.8 队内赛 暴力T1 Lyrith -迷宮リリス-相关的知识,希望对你有一定的参考价值。

Lyrith -迷宮リリス-

luogu 11.8 队内赛 T1 Lyrith -迷宮リリス-


题面


输入输出样例
输入 #1

12345

输出 #1

YES
34152

输入 #2

9718798

输出 #2

NO


解题思路

1000是8的倍数,所以1000的倍数也是8的倍数
所以只用考虑最后的三位就好了,从第四位(从右往左数)到后面的数不管是什么都是1000的倍数,也就是8的倍数

暴力枚举1到1000之间的倍数,然后用桶记录0~9出现的次数,判断能不能凑出倍数

我的程序有个锅,1000的时候输出0001000,但是还是过了于是我不改了😅


Code

#include <bits/stdc++.h>

using namespace std;

int a[100100], cnt[10], n, ls[100100];

void read() {
	char c = getchar();
	while(!(c >= '0' && c <= '9')) c = getchar();
	while(c >= '0' && c <= '9') a[++ n] = c - '0', cnt[a[n]] ++, c = getchar();  //cnt统计给出的数中0~9出现次数
}

int check(int x) {
	memset(ls, 0, sizeof(ls));
	if(x < 100) ls[0] ++;  //特判前导零
	if(x < 10) ls[0] ++;
	while(x) {
		ls[x % 10] ++;  //ls统计答案数后三位,0~9出现的次数
		x /= 10;
	}
	for(int i = 0; i <= 9; i ++)
		if(ls[i] > cnt[i]) return 0;  //如果需要的数大于给出的数,比如999和199,需要3个9,只给出了2个9
	return 1;
}

void write(int x){
	memset(ls, 0, sizeof(ls));
	if(x < 100) ls[0] ++;
	if(x < 10) ls[0] ++;
	int ans = x;
	while(x) {
		ls[x % 10] ++;
		x /= 10;
	}
	for(int i = 0; i <= 9; i ++)
		for(int j = 1; j <= cnt[i] - ls[i]; j ++)  //后三位固定,其他位爱怎么输出怎么输出😅
			printf("%d", i);
	for(int i = 1; i <= ls[0]; i ++) printf("0");  //先把前导零输出
	printf("%d", ans);
}

int main() {
	read();
	for(int i = 8; i <= 1000; i += 8) {
		if(i % 8) continue;
		if(check(i)) {
			printf("YES\\n");
			write(i);
			return 0;
		}
	}
	printf("NO");
} 

以上是关于luogu 11.8 队内赛 暴力T1 Lyrith -迷宮リリス-的主要内容,如果未能解决你的问题,请参考以下文章

队内赛T1贪心日常

队内赛 T1数学题高尚的战斗之神想要取模

队内ACM赛

11.8早 考试总结

2017.5.26暴力赛解题报告

OI队内测试——石门一