zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    UVA 10462 Is There A Second Way Left?(次小生成树&Prim&Kruskal)题解
    POJ 1679 The Unique MST (次小生成树)题解
    POJ 2373 Dividing the Path (单调队列优化DP)题解
    BZOJ 2709 迷宫花园
    BZOJ 1270 雷涛的小猫
    BZOJ 2834 回家的路
    BZOJ 2506 calc
    BZOJ 3124 直径
    BZOJ 4416 阶乘字符串
    BZOJ 3930 选数
  • 原文地址:https://www.cnblogs.com/fate-/p/12500581.html
Copyright © 2011-2022 走看看