标签:scanf size str 删掉 string 一个 int false 写代码
题目描述:
一个数列,问能否去掉一个数,使得剩下的按顺序排列(不增或不减均可)。
思路:
思路很显然,统计比前者小的数和大的数的个数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 }
标签:scanf size str 删掉 string 一个 int false 写代码
原文地址:https://www.cnblogs.com/LiqgNonqfu/p/9736109.html