5153. 删除

题目:

样例1:

输入
3454

输出
YES
344

 样例2:

输入
10

输出
YES
0

 样例3:

输入
111111

输出
NO

思路:

        这道题就三个条件

关键条件是  能够被 8 整除。    而能被 8 整除的有一个重要的性质是 

能够被 8 整除的重要性质
能被8整除的数的特征是它的末三位是0、8、16、24、32、40、48、56、64、72、80、88、96中的一个
这个特征是由能被2整除和能被4整除的数的特征推导出来的。掌握了这个特征,我们就可以很方便地判断一个数能否被8
整除了。

即看整个数中的 末三位是否可以被 8 整除,然后这是个不计删除个数,所以我们只要找到这些数是否在 num 里面即可。

代码详解如下:

#include <iostream>
#include <unordered_map>
#define endl '\n'
#define YES puts("YES")
#define NO puts("NO")
#define umap unordered_map
#pragma GCC optimize(3,"Ofast","inline")
#define ___G std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
using namespace std;
const int N = 2e6 + 10,MOD = 998244353;
string num;

// 寻找满足末3位能够被 8 整除的数,是否在 num 里面
inline bool FindAns(string &ans)
{
	int n = ans.size(),idx = 0;
	
	// 循环寻找
	for(auto i : num)
	{
		if(i == ans[idx]) ++idx;
		if(idx == n) return true;
	}
	
	return false;
}
inline void solve()
{
	string ans;
	
	getline(cin,num);
	
	// 由于不计删除个数,所以我们找到 末三位 可以被8整除 的数字计科
	// 获取在 末三位 以内的数字可以被 8 整除的数
	// i += 8 就可以满足被 8 整除
	for(int i = 0;to_string(i).size() <= 3;i += 8)
	{
		// 获取该性质的数字
		ans = to_string(i);
		
		// 开始判断是否是答案
		if(FindAns(ans))
		{
			cout << "YES" << endl << ans << endl;
			return ;
		}
	}
	cout << "NO" << endl;
}


int main()
{
//	freopen("a.txt", "r", stdin);
	___G;
	int _t = 1;
//	cin >> _t;
	while (_t--)
	{
		solve();
	}

	return 0;
}

最后提交:

猜你喜欢

转载自blog.csdn.net/hacker_51/article/details/133340680