题面(中文)
思路:题目并不难,但是该错误改了好一会,说一下这个题的意思就是数组每一个大于十的数可以选择把它替换成这个数按照原来的顺序把每一位都拆分数组原位置,是得这个数组非递减,也就是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