【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");
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值