给定两个数组A和B,其中数组A几乎是严格升序排列的,几乎的定义是只需改变其中一个数,即可以满足完全升序排列
你的任务是从数组A中找到这个数字,并从数组B中选取一个数并将其替换,使得数组A是完全升序排列的(严格升序排列,即不允许相邻两个为相同的数)
请找出数组B中满足要求的最大数字,并输出最终有序的数组,如果不存在就输出NO
输入描述:
共两行,第一行是数组A,第二行是数组B,元素之间用空格分隔(数组A的长度,数组B的长度<100)
输出描述:
共一行,为最终有序的数组,不存在则输出NO
输入:
1 3 7 4 10
2 1 5 8 9
输出:
1 3 7 9 10
输入
20 1 23
50 26 7
输出
NO
思路:
如果根据题意从A中寻找,那么需要不仅需要挨个判断,而且找到有不符合要求的还不知道要修改后面一个或者前面一个。 另外还有很多边界条件,很难弄
但是逆向思维,将B排序,从大到小取B中每一个元素,然后将其与B中每一个元素替换,然后第三层循环判断是不是符合严格升序排列的。如果符合,跳出,不符合给她换回去
#include <cstring>
#include <string>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> A, B;
while(true)
{
int x;
cin>>x;
A.push_back(x);
char c = cin.get();
if(c=='\n')
break;
}
while(true)
{
int x;
cin>>x;
B.push_back(x);
char c = cin.get();
if(c=='\n')
break;
}
sort(B.begin(),B.end());
for(int i = B.size() - 1;i>=0;--i)
{
int x = B[i];
for(int j = A.size()-1;j>=0;--j)
{
int temp = A[j];
A[j] = x;
bool flag = true;
for(int k = 0; k<A.size()-1; ++k)
{
if(A[k]>=A[k+1])
{
flag = false;
break;
}
}
if(flag)
{
for(int k =0; k<A.size(); ++k)
{
if(k)
cout<<' ';
cout<<A[k];
}
return 0;
}
A[j] = temp;
}
}
cout<<"NO";
return 0;
}