【洛谷 2021.11.8团队模拟赛】 Lyrith -迷宮リリス-【数学】

102 篇文章 1 订阅
102 篇文章 0 订阅

在这里插入图片描述

在这里插入图片描述


解题思路

考虑8的倍数的特征,只要最后三位组成的数时8的倍数就好了。。预处理出1000以内8的倍数,判断输入的字符串里是否包含它们,如果有包含,就把它放最后输出。

注意特判小于三位的情况还有刚好那三位为0的情况。


代码

#include <bits/stdc++.h>
#define ll long long
using namespace std;

string s;
int l,cnt,k,a[1010],w[15],v[15];
bool flag;

string read() {
	char a=getchar();
	string ss="";
	while(a<'0'||a>'9')
		a=getchar();
	while(a>='0'&&a<='9') {
		ss=ss+a;
		a=getchar();
	}
	return ss;
}

void output(int a1,int a2,int a3) {
	printf("YES\n");
	int o1,o2,o3;
	string ss;
	o1=o2=o3=1;
	for(int i=0; i<l; i++) {
		int x=s[i]-'0';
		if(o1==1&&x==a1) {
			o1=2;
			continue;
		}
		if(o2==1&&x==a2) {
			o2=2;
			continue;
		}
		if(o3==1&&x==a3) {
			o3=2;
			continue;
		}
		ss=ss+s[i];
	}
	cout<<ss<<a1<<a2<<a3<<endl;
}

int main() {

	for(int i=100; i<=1000; i++) {
		if(i%8==0)
			a[++cnt]=i;
	}
	s=read();
	l=s.size();
	if(l<3) {
		int x=0;
		for(int i=0; i<l; i++)
			x=x*10+s[i]-'0';
		if(x%8==0) {
			printf("YES\n");
			cout<<x;
		} else printf("NO\n");
	}
	for(int i=0; i<l; i++) {
		int x=s[i]-'0';
		if(s[i]=='0')k++;
		w[x]++;
	}
	if(k>=3)
	{
		output(0,0,0);
		return 0;
	}
	for(int i=1; i<=cnt; i++) {
		int a1=a[i]/100,a2=a[i]/10%10,a3=a[i]%10;
		v[a1]++,v[a2]++,v[a3]++;
		if(w[a1]>=v[a1]&&w[a2]>=v[a2]&&w[a3]>=v[a3]) {
			output(a1,a2,a3);
			return 0;
		}
		v[a1]=v[a2]=v[a3]=0;
	}
	printf("NO");
}
/*
7200002400000000000*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值