zoukankan      html  css  js  c++  java
  • Sort the Array

     1 /*
     2    思路: 
     3    找到单调下降串的起始位置[l, r]
     4    如果左边 0...l-1中的最大值 > l...r中的最小值 或者
     5    r+1...n中的最小值 < l...r中的最大值 都是不能实现排序的! 
     6 */
     7 #include<iostream>
     8 #include<cstdio>
     9 #include<algorithm>
    10 using namespace std;
    11 typedef long long LL;
    12 int cur, nt;
    13 int cnt;
    14 int num[100005];
    15 int main(){
    16    int i, n;
    17    int begin, end;
    18    int flag;
    19    int min1, max2;
    20    while(scanf("%d", &n)!=EOF){
    21           cnt=cur=0;
    22        flag=0;
    23        for(i=1; i<=n; ++i){
    24           scanf("%d", &nt);
    25           num[i]=nt;
    26           if(nt>cur)
    27              flag=0;
    28           if(!flag && nt<cur){
    29              ++cnt;
    30              flag=1;
    31              begin=i-1;
    32              end=i;
    33           }
    34           if(flag && nt<cur)
    35                end=i;
    36           cur=nt;
    37        }
    38       if(cnt==1){
    39            min1=0x3f3f3f3f;
    40            if(end!=n)
    41                min1=num[end+1];
    42          max2=-0x3f3f3f3f;
    43          if(begin!=1)
    44              max2=num[begin-1];
    45          if(max2>num[end] || min1<num[begin]) 
    46             printf("no
    ");
    47          else
    48             printf("yes
    %d %d
    ", begin, end);
    49       }
    50       else if(cnt==0)
    51          printf("yes
    1 1
    ");
    52       else printf("no
    ");
    53    }
    54    return  0;
    55 }

     1 /*
     2 思路:
     3    将两边单调递增的序列排除(将元素和元素下标一一映射起来,排序之后找到元素和下标映射不同的两个端点),然后中间的那部分就是要翻转的!
     4 最后检查翻转部分的元素和下标是否对应!
    5 6 */ 7 #include<iostream> 8 #include<algorithm> 9 #include<map> 10 #include<cstdio> 11 #define M 100005 12 using namespace std; 13 int n; 14 int a[M], b[M]; 15 map<int, int>mp; 16 int main(){ 17 int i; 18 while(cin>>n){ 19 for(i=0; i<n; ++i){ 20 cin>>a[i]; 21 b[i]=a[i]; 22 } 23 sort(a, a+n); 24 for(i=0; i<n; ++i) 25 mp[b[i]]=i; 26 for(i=0; i<n; ++i) 27 a[i]=mp[a[i]]; 28 int L=-1, R=-1; 29 for(i=0; i<n; ++i) 30 if(a[i]!=i){ 31 L=i; 32 break; 33 } 34 for(i=n-1; i>=0; --i) 35 if(a[i]!=i){ 36 R=i; 37 break; 38 } 39 int ok=1; 40 if(L==-1 || R==-1) 41 cout<<"yes"<<endl<<"1 1"<<endl; 42 else{ 43 reverse(a+L, a+R+1); 44 45 for(i=L; i<=R; ++i){ 46 if(a[i]!=i){ 47 ok=0; 48 cout<<"no"<<endl; 49 break; 50 } 51 } 52 53 if(ok) 54 cout<<"yes"<<endl<<L+1<<" "<<R+1<<endl; 55 } 56 } 57 return 0; 58 }
  • 相关阅读:
    【HANA系列】SAP HANA LEFT/RIGHT字符串截取
    【HANA系列】SAP HANA SQL REPLACE替换字符串
    【HANA系列】SAP HANA SQL获取某字符串的位置
    【HANA系列】SAP HANA SQL获取字符串长度
    【HANA系列】SAP HANA SQL从给定日期中获取月份
    【HANA系列】SAP HANA SQL从给定日期中获取分钟
    【HANA系列】SAP HANA SQL查找字符串位置
    【HANA系列】SAP HANA SQL截取字符串
    【HANA系列】SAP HANA SQL获取时间中的小时
    【HANA系列】SAP HANA SQL从给定日期中获取年份
  • 原文地址:https://www.cnblogs.com/hujunzheng/p/3885952.html
Copyright © 2011-2022 走看看