• 数组:2.近序数组


    【问题描述】

            对于一个具有 n 个元素的数组,如果可以将其分为两个部分,它的各个部分都是一个非严格有序数组,则我们称这样的数组为近序数组,例如

     数组 1、2、3、4、4、3、2、1是近序数组,数组 4、2、1、2、3、4也是近序数组,而1、5、7、3、9、3就不是近序数组,数组1、3、3、4是有序数组,是近序数组的特例。

     【输入形式】

            输入的第一行为一个整数n,表示数组的元素个数。

            接下来的一行,表示数组的元素。

    【输出形式】

            如果给定的数组是近序数组输出Yes,否则输出No。
    【样例输入1】

    8
    1 2 3 4 4 3 2 1

    【样例输出1】

    Yes

    【样例输入2】

    3 4 3 4

    【样例输出2】

    Yes

    【样例输入3】

    3 4 3 4 3

    【样例输出3】

    No

    【样例说明】
    【评分标准】

    //给大家解读一下

    上网也没找到近序数组的定义

    个人认为近序数组就是由两个不一定相同单调性的区间构成的数组

    记增区间为↑,减区间为↓,不增不减区间为=,若中间有两数相同为==

    则近序数组可以为:

    1.↑、↓、=(单纯一直增加,减小和不变的)

    2.↑↓、↑=、↑==↓、↓↑、↓=、↓==↑、=↑、=↓

    所以要分类讨论

    代码如下:

    1. #include//此题介绍一个近序数组的能分成两个非严格有序数组,可以转化为数组中有且仅有1或2个单调区间,即这个数组中只有1或0个转折点
    2. using namespace std;
    3. int main() {
    4. int n,a,tp=100000,sum1,sum2,sum3,sum4,sum5,sum6;//tp为turning point转折点;此处tp初值设为100000是为了把tp和j区分开(因为测试点j和n不可能超过100000)
    5. cin>>n;
    6. int arr[n];
    7. for(int i=0; i
    8. cin>>a;
    9. arr[i]=a;
    10. }
    11. if(arr[0]1]) { //第一种情况 ↑
    12. sum1=0;
    13. sum2=0;
    14. sum3=0;
    15. for(int j=1; j
    16. if(arr[j-1]>arr[j]) {
    17. tp=j;
    18. break;
    19. }
    20. }
    21. if(tp==100000) {
    22. cout<<"Yes"<
    23. return 0;//若无转折点,必为近序数组
    24. }
    25. for(int k=tp; k-1; k++) {
    26. if(arr[k]>arr[k+1])
    27. sum1+=1;
    28. else
    29. break;
    30. }
    31. for(int k=tp; k-1; k++) {
    32. if(arr[k]1])
    33. sum2+=1;
    34. else
    35. break;
    36. }
    37. for(int k=tp; k-1; k++) {
    38. if(arr[k]==arr[k+1])
    39. sum3+=1;
    40. else
    41. break;
    42. }
    43. if(sum1==n-1-tp||sum2==n-1-tp||sum3==n-1-tp) {
    44. cout<<"Yes"<
    45. } else {
    46. cout<<"No"<
    47. }
    48. } else if(arr[0]>arr[1]) { //第二种情况 ↓
    49. sum1=0;
    50. sum2=0;
    51. sum3=0;
    52. for(int j=1; j
    53. if(arr[j-1]<=arr[j]) {
    54. tp=j;
    55. break;
    56. }
    57. }
    58. if(tp==100000) {
    59. cout<<"Yes"<
    60. return 0;
    61. }
    62. for(int k=tp; k-1; k++) {
    63. if(arr[k]1])
    64. sum1+=1;
    65. else
    66. break;
    67. }
    68. for(int k=tp; k-1; k++) {
    69. if(arr[k]>arr[k+1])
    70. sum2+=1;
    71. else
    72. break;
    73. }
    74. for(int k=tp; k-1; k++) {
    75. if(arr[k]==arr[k+1])
    76. sum3+=1;
    77. else
    78. break;
    79. }
    80. if(sum1==n-1-tp||sum2==n-1-tp||sum3==n-1-tp) {
    81. cout<<"Yes"<
    82. } else {
    83. cout<<"No"<
    84. }
    85. } else if(arr[0]=arr[1]) { //第三种情况 =
    86. sum1=0;
    87. sum2=0;
    88. sum3=0;
    89. sum4=0;
    90. sum5=0;
    91. sum6=0;
    92. for(int j=1; j-1; j++) {
    93. if(arr[j]1]) {
    94. sum1+=1;
    95. } else if(arr[j]>arr[j+1]) {
    96. sum2+=1;
    97. } else if(arr[j]==arr[j+1]) {
    98. sum3+=1;
    99. }
    100. for(int j=1; j
    101. if(arr[j-1]!=arr[j]) {
    102. tp=j;
    103. if(j==n-1) {
    104. cout<<"Yes"<
    105. return 0;
    106. } else {
    107. for(int k=tp; k-1; k++) {
    108. if(arr[k]1])
    109. sum4+=1;
    110. else
    111. break;
    112. }
    113. for(int k=tp; k-1; k++) {
    114. if(arr[k]>arr[k+1])
    115. sum5+=1;
    116. else
    117. break;
    118. }
    119. for(int k=tp; k-1; k++) {
    120. if(arr[k]==arr[k+1])
    121. sum6+=1;
    122. else
    123. break;
    124. }
    125. }
    126. }
    127. }
    128. }
    129. if(sum1==n-2||sum2==n-2||sum3==n-2||sum4==n-1-tp||sum5==n-1-tp||sum6==n-1-tp) {
    130. cout<<"Yes"<
    131. } else {
    132. cout<<"No"<
    133. }
    134. }
    135. system("pause");
    136. return 0;
    137. }

    PS:下午睡醒觉起来脑子坏掉了,用了个最笨的方法编了好长时间,就像打补丁一样改来改去,自己也不是很满意

    uu们如果有更好更简洁的方法记得发我一下(>▽<)

  • 相关阅读:
    Chrome、Edge 合力“围剿“,Safari 夹缝求生?
    测试基础知识
    注入常考面试题总结
    分省/市/县最低工资标准-12-2021年&1949-2020全国/省/市/县GDP数据
    337. 打家劫舍 III
    互联网摸鱼日报(2023-09-07)
    Android GUI系统之SurfaceFlinger(16)MessageBase解读
    使用c#强大的表达式树实现对象的深克隆
    聊聊编程是什么
    低代码:数字化转型趋势下的快速开发方式
  • 原文地址:https://blog.csdn.net/obstacle19/article/details/127126171