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。

posted @ 2020-03-15 22:22  ice--cream  阅读(131)  评论(0编辑  收藏  举报