• I don't want to be deducted


    Description

    Lucy自尊心强,要是某个月的工资比前一个月少了,她就会哭。
    现在依次告诉你Lucy未来几个月的薪水(单位:万元),而你是一个来自未来的黑客,你可以改变某一个月公司给她发放的薪水,让她不会因为薪水而哭。
    举个例子:你知道了Lucy连续四个月的薪水0 4 2 3你可以改变第二个月的工资为1,那她就不会哭了。

    Input

    第一行一个整数n(n>0&&n<=12);
    第二行n个月的工资(保证都为10以内的非负整数);

    Output

    你是否能让她不哭;
    是,输出YES;
    否,输出NO;

    Sample Input

    4
    0 4 2 3
    

    Sample Output

    YES




     1 #include<stdio.h>
     2 int a[103];
     3 int main(){
     4     int n;
     5     scanf("%d",&n);
     6     for(int i=1;i<=n;i++){
     7         scanf("%d",&a[i]);
     8     }
     9     for(int i=1;i<n;i++){
    10         if(a[i]>a[i+1]){//如果顺序没有按照升序排列 
    11             if(a[i-1]>a[i+1]){//依情况改值 
    12                 a[i+1]=a[i];
    13             }
    14             else{
    15                 a[i]=a[i+1];
    16             }
    17             break;
    18         }
    19     }
    20     for(int i=1;i<n;i++){//改完一个值后,如果发现还有不按顺序的,那么就是NO 
    21         if(a[i]>a[i+1]){
    22             printf("NO");
    23             return 0;
    24         }
    25     }
    26     printf("YES");//都按顺序了就是YES 
    27     return 0;
    28 }

    这道题呢,如果在这一串数里有两个或两个以上的降序过程,也就是像这样的序列

    例一:4 3 2             4到3降序了,3到2降序了

    例二:1 5 4 2 1    5到4降序了,4到2降序了,2到1降序了

    例三:1 9 4 8 3    9到4降序了,8到3降序了 

    这样的序列光改一个数是没办法让序列按升序排列的(在这里,我把相等的情况也算作升序排列了),所以这样的情况就是没救了,一定是NO。

    那如果所有数都是按升序排列的,那一定就是YES了,

    接下来就剩下一种情况,那就是只有一个降序过程的序列,像这样:

    例一:4 1 3       4到1是降序

    例二:3 4 2 6    4到2是降序

    例三:1 4 2 6    4到2是降序

    例四:3 4 2 3       4到2是降序

    这样的情况稍复杂一些,有些情况是YES,有些情况是NO,但是有些事情是固定的,那就是我们在改数的时候,只有改与降序有关的那两个数才会起到作用,比如 4 1 3 这两个数,与降序有关的数就是4 和1 ,题目中要求只能改一次,所以只有改他们中的一个我们才有可能解决问题。又因为我们想要的结果是非递减序列,而与降序有关的那两个数一定是降序排列的,第一个数大于第二个数,所以要改的话,第一个数改成第二个数,或者第二个数改成第一个数,当然有其他更改的方式,但我们在程序中用这种方式,因为这种是一定可以把当前的降序改为非降序的,而到底改哪个就要看实际情况了。

    首先看例一:4 1 3 与降序有关的数是4和1,当我们把4改成1时,序列变为1 1 3 ,为非递减序列,符合条件。但如果把1变成4的话,序列变成4 4 1,不符合条件。这种情况只有改第一个数是符合条件的。

    例二:3 4 2 6 ,与降序有关的两个数是4 和 2 ,把4改为2 ,序列变为3 2 2 6,不符合条件,把2 改为4 ,序列变为3 4 4 6,符合条件。这种情况只有改第二个数是符合条件的。

    例三:1 4 2 6 ,与降序有关的两个数是4和2,把4改成2,序列变为1 2 2 6,符合条件。把2改为4,序列变为1 4 4 6,符合条件。这种情况改两个数都符合条件。

    例四:3 4 2 3 ,与降序有关的两个数是4和2,把4改成2,序列变为3 2 2 3,不符合条件,把2改为4,3 4 4 3,不符合条件,这种情况改两个数都不符合条件。

    由上,我们发现,当改两个数后都会符合条件或者都会不符合条件的时候,改哪个数都无所谓。但如果改其中一个数符合条件,改另一个数就不符合条件的话,怎么区分呢?我的想法是,先找出什么样的情况要改第一个数,剩下的情况就都改第二个数就行了(好像是废话?)。那么什么样的情况可以改第一个数呢。例二是改了第二个数才符合情况的,我们先看看为什么例二不能改第一个数,例二的序列为3 4 2 6 ,把4改为2后,序列变为3 2 2 6 ,序列里又出现了新的降序,这是因为第一个数造成的。在降序过程的那两个数中,第一个数肯定大于第二个数,就是4大于2,把第一个数改成第二个数后,如果第一个数前的那个数,在这里就是3,如果这个数大于第二个数的话,也就是3大于2,那么在我们改完第一个数后,第一个数就会小于它前面的那个数了,就会出现新的降序。所以归根到底就是第一个数之前的那个数的问题,所以当第一个数之前的那个数小于等于第二个数时,我们就改第一个数,剩下的所有情况都改第二个数。

    因为题目中说只能改一个数,所以我们改完一个数后,就立马停止改数。进入下一步。

    下一步就是:遍历一遍序列,如果这时候序列中还有降序的过程,那么这个序列就是没救了,结果肯定是NO,如果没有降序的过程了,那么结果就是YES。

  • 相关阅读:
    java爬虫(八)使用node.js获取network中api接口内信息并用java的jsoup重写该方法
    java爬虫(七)使用httpclient模拟浏览器GET,POST
    Java selenium对cookies的操作
    java爬虫(六)分析AJAX接口获取网页动态内容
    java爬虫(五)利用selenium 模拟点击获取动态页面的内容
    java爬虫(四)利用Jsoup获取需要登陆的网站中的内容(无验证码的登录)
    java爬虫(三)利用HttpClient和Jsoup模拟网页登陆(无验证码)
    Java远程服务器调优
    20 vue-router的使用
    19 关于Vue中main.js,App.vue,index.html之间关系进行总结
  • 原文地址:https://www.cnblogs.com/fate-/p/12500581.html
Copyright © 2020-2023  润新知