luogu 11.8 队内赛 暴力T1 Lyrith -迷宮リリス-
Posted SSL_ZZL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luogu 11.8 队内赛 暴力T1 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 -迷宮リリス-的主要内容,如果未能解决你的问题,请参考以下文章