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

    题目大意:
    判断能否通过一次倒置,使序列变为一个递增序列

    如果可以,输出倒置那一段的起始点和终点的位置;

    题目链接:http://codeforces.com/problemset/problem/451/B

    我自己的做法是用一个数组b保存原数组中小于后一个点的点的下标。

    如果b数组中后一个数比前一个数大了超过一,说明有2段递减序列,不成立。

    如果均后一个比前一个大1,那么在判断倒置前起始的位置和它倒置后的下一个位置是否递增进行判断,在进行倒置前结束的位置和它倒置后的上一个位置是否递增进行判断

    均成立,输出两个位置

     1 #include<iostream>
     2 #include<cstdio>
     3 using namespace std;
     4 #define N 100100
     5 int a[N],b[N];
     6 int cnt;
     7 int main()
     8 {
     9     int n,flag;
    10 
    11     while(scanf("%d",&n)!=EOF){
    12         flag=1;cnt=0;
    13 
    14         for(int i=0;i<n;i++) b[i]=-1;
    15         for(int i=0;i<n;i++) cin>>a[i];
    16         for(int i=0;i<=n-2;i++){
    17             if(a[i]>a[i+1]) b[cnt++]=i;
    18         }
    19         if(cnt>0)
    20         {
    21             b[cnt]=b[cnt-1]+1;
    22             cnt++;
    23         }
    24 
    25         for(int i=0;i<cnt-1;i++){
    26             //cout<<b[i]<<endl;
    27             if(b[i+1]-b[i]!=1)
    28             {
    29                 flag=0;
    30                 break;
    31             }
    32         }
    33         if(b[0]==-1) {cout<<"yes"<<endl<<1<<' '<<1<<endl;continue;}
    34 
    35         if(flag==1)
    36          {
    37               if(b[cnt-1]<n-1) {if(a[b[0]]>a[b[cnt-1]+1])flag=0;}
    38               if(b[0]>0){if(a[b[cnt-1]]<a[b[0]-1]) flag=0;}
    39          }
    40 
    41         if(flag==0)cout<<"no"<<endl;
    42         else{
    43             cout<<"yes"<<endl<<b[0]+1<<' '<<b[cnt-1]+1<<endl;
    44         }
    45     }
    46 
    47     return 0;
    48 }
    View Code
  • 相关阅读:
    JavaScript高度和宽度详解
    VC6程序图标
    VC++中的Dlg,App,Doc,view
    Vista桌面图标无法拖动
    VC2008中IE8脚本错误问题解决
    单文件安装包制作(转)
    AutoResetEvent与ManualResetEvent区别
    纯JavaScript中调用WebServices
    动态加载程序集Assembly.Load
    VC++小知识积累
  • 原文地址:https://www.cnblogs.com/CSU3901130321/p/3871531.html
Copyright © 2011-2022 走看看