// 遍历整数序列,看当前数字是否小于等于它后面的那个数 #include <stdio.h> int main() { int arr[10000] = { 0 }; int count = 0; while (scanf("%d", &arr[count]) != EOF) { ++count; } // 输入完毕,开始处理 int flag = 0; // 修改次数的计数器 for (int i = 0; i < count - 1 && flag <= 1; ) { // 如果第一个数大于第二个数,则将第一个数改为和第二个数相等 if (i == 0 && arr[i] > arr[i + 1]) { arr[i] = arr[i + 1]; ++i; // 向后递增1,开始判断下一个数字 ++flag; // 做出了一次修改,修改次数计数器要递增1 } else if (arr[i] > arr[i + 1]) { // 在非第一个数的位置发生了降序 arr[i] = arr[i - 1]; // 让当前的数等于它的前一个数, ++flag; // 做出了一次修改,修改次数计数器要递增1 // 此时不要改变i的值,因为下一次循环还要检查这个改完之后的数是否还是比后面的数大, // 即该数的前一个数可能比后一个数大,比如6,5,4这种情况,将5改为6之后仍然比后面的4大, // 是因为5前面的6大于5后面的4 } else { // 非降序时直接递增i,判断下一个数字即可 ++i; } } // 循环结束有可能是因为i=count-1 (此时说明可以只修改一次),也可能是因为flag=2 (说明修改次数超过限制了) // i的递增和flag的递增只有当i为0时才会一起进行,因此i=count-1和flag=2不可能同时发生,两个等式只有一个成立 if (flag > 1) printf("0"); else printf("1"); return 0; }