HDU5532 Almost Sorted Array

题目描述:

  一个数列,问能否去掉一个数,使得剩下的按顺序排列(不增或不减均可)。

 

思路:

   思路很显然,统计比前者小的数和大的数的个数a和b,如果a,b中有一个是1,那就试着删去这唯一一个变化的数或它之前的。(可以不尝试它后一个数)

 

/**************为了少写代码,开始没模拟删的过程,if了若干种输出NO的情况,WA了5次(此时改的已经比模拟麻烦了),最终重写了一边,还是直接删掉再检查是否单调。**********/

 

我的丑陋代码。

 

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<cstdlib>
  4 #include<algorithm>
  5 
  6 using namespace std;
  7 
  8 int T,n,a[100005];
  9 int dtu[100005],cnt,utu[100005],cn;
 10 
 11 bool del(int x)
 12 {
 13     bool f=true;
 14     int tem=a[1];
 15     for(int i=2;i<=n;i++)
 16     {
 17         if(i==x)continue;
 18         if(a[i]>tem)f=false;
 19         tem=a[i];
 20     }
 21     if(f)return true;
 22     f=true;tem=a[1];
 23     for(int i=2;i<=n;i++)
 24     {
 25         if(i==x)continue;
 26         if(a[i]<tem)f=false;
 27         tem=a[i];
 28     }
 29     if(f)return true;
 30     return false;
 31 }
 32 
 33 int main()
 34 {
 35     scanf("%d",&T);
 36     for(int I=1;I<=T;I++)
 37     {
 38         memset(a,0,sizeof(a));
 39         cn=0;cnt=0;
 40         memset(utu,0,sizeof(utu));
 41         memset(dtu,0,sizeof(dtu));
 42         scanf("%d",&n);
 43         for(int i=1;i<=n;i++)
 44         {
 45             scanf("%d",&a[i]);
 46             if(i==1)continue;
 47             if(a[i]<a[i-1])
 48             {
 49                 cnt++;
 50                 dtu[cnt]=i;//情况1:先增减再增的情况数与位置 
 51             }
 52             if(a[i]>a[i-1])
 53             {
 54                 cn++;
 55                 utu[cn]=i;//情况2:先减再增再减 的 
 56             }
 57         }
 58         if(n<=3)
 59         {
 60             printf("YES\n");
 61             continue;
 62         }
 63         if(cn>=2&&cnt>=2)
 64         {
 65             printf("NO\n");
 66             continue;
 67         }
 68         else
 69         {
 70             if((cn==0)||(cnt==0))
 71             {
 72                 printf("YES\n");
 73                 continue;
 74             }
 75             if(cnt==1)
 76             {
 77                 int id=dtu[cnt];
 78                 if((id==2)||(id==n))
 79                 {
 80                     printf("YES\n");
 81                     continue;
 82                 }
 83                 if(del(id)||del(id-1))
 84                 {
 85                     printf("YES\n");
 86                     continue;
 87                 }
 88             }
 89             if(cn==1)
 90             {
 91                 int wei=utu[cn];
 92                 if((wei==2)||(wei==n))
 93                 {
 94                     printf("YES\n");
 95                     continue;
 96                 }
 97                 if(del(wei)||del(wei-1))
 98                 {
 99                     printf("YES\n");
100                     continue;
101                 }
102             }
103         }
104         printf("NO\n");
105     }
106     return 0;
107 } 

 

posted @ 2018-10-01 23:24  liqgnonqfu  阅读(120)  评论(0编辑  收藏  举报