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。