codeforces 451 B . Sort the Array

codeforces 451B.Sort the Array

题意:

  给出n个数,将其某一段区间翻转之后,使数组元素递增,如果可以,输出那段区间,否则输出 no

题解:

   ①如果本身数组递增, 那么输出 1 1.

   ②如果有两个以上递减区间,那么输出 no

  ③ 如果递减的第一个元素大于递减区间的后一个元素,或递减区间的最后一个元素大于递减区间前的元素, 输出no

 2, 5 ,3 , 1, 4, 6(这种情况不满足)

递减区间 5 ,3, 1            所以要保证 5小于4且 1 要大于 2 ,因为不满足,输出 no 

5为递减区间的第一个元素,1为递减区间的最后一个元素

2为递减区间前的一个元素,4为递减区间后的一个元素

 

AC代码

#include <bits/stdc++.h>
using namespace std;
int a[1000005];
int main(){
	int n, ans1 = 0, ans2 = 0, f = 0;
	cin >> n;
	for(int i = 1; i <= n; i++){
		cin >> a[i];
	}
	a[0] = -1; a[n+1] = 1000000001; // 第一个设为负数,最后一个设很大
	for(int i = 1; i <= n; i++){
		if(a[i] > a[i+1] && ans1 == 0){  // 第一个递减区间
			ans1 = i;                    // 第一个递减区间的首位置
			while(a[i] > a[i+1]){
				ans2 = i;                // 递减区间的末位置
				i++;
			}
			f++;
		}
		else if(a[i] > a[i+1]){      // 出现多个递减区间
			f++;
		}
	}
	if(f == 0){ // 数组元素本身单调递增
		cout << "yes" << endl << "1 1" << endl;
	}
	
	else if(f > 1 || a[ans1] > a[ans2+2] || a[ans2+1] < a[ans1-1]){
		cout << "no" << endl; // f>1多个递减区间  这里画图解释
	}
	else{
		cout << "yes" << endl << ans1 << " " << ans2+1 << endl;
	}
	return 0;
}

 

上一篇:451-JavaSE进阶-Double的构造方法


下一篇:LeetCode 451. 根据字符出现频率排序