cf B. Array Fix

题面(中文)
请添加图片描述

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
思路:题目并不难,但是该错误改了好一会,说一下这个题的意思就是数组每一个大于十的数可以选择把它替换成这个数按照原来的顺序把每一位都拆分数组原位置,是得这个数组非递减,也就是a[i]<= a[i+1],那么一开始我是想的从头往后遍历后来发现出现了问题,比如5 个数字12 77 23 34 45,从头遍历的时候77 大于23 那么77 就会拆分这样又得看前面然后前面又得拆分,那么贪心一点想,只有后面的拆分才会影响前面的,所以可以想到从后往前遍历那么即使后面的要拆分也还是会在次考虑前面的。
上代码
下面展示一些 内联代码片

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t ;
int n ;
int a[60];
int main() {

	cin >> t;
	while (t --) {
		cin >> n;
		for (int i = 1; i <= n; i ++) {
			cin >> a[i];
		}
		int f = 0;
		for(int i = n;i > 1;i --)// 倒着遍历更方便
		{
			if(f)break;//f用来标记这一组是否可行是不是需要继续遍历下去
			if(a[i - 1] > a[i])
			{
				if(a[i - 1] < 10){//如果无法拆分的话就no
					cout << "NO" << endl;
					f = 1;
					break;
				}else {//下面只要判断拆分的那个数拆分之后是否每一位都是非递减的,以及拆分之后最后一位是不是还比a[i]大,然后保留拆分的第一位
					int num = a[i - 1] % 10;
					if(num > a[i])
					{
						cout << "NO" << endl;
						f = 1;
						break;
					}
					int flag = 1e9;
					while(a[i - 1]){
						if(a[i - 1] % 10 > flag)
						{
							cout << "NO" << endl;
							f = 1;
							break;
						}
						flag = a[i - 1] % 10;
						a[i - 1] /= 10;
						
					}
					a[i - 1] = flag;
					
				}
			}
		}
		if(!f)cout << "YES" << endl;
	}

	return 0;
}

小白代码有问题请指出 awa

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值