题解 CF719A 【Vitya in the Countryside】
CF719A 【Vitya in the Countryside】,if好题,你值得拥有。
题目大意就是给出月亮盈亏,然后预测下面的情况。
来看一个图:
(手工绘制,不要在意美观细节。)
很显然的两个点:
-
当题目数据同 A、E 相同时,答案是
UP
。 -
当题目数据同 C 相同时,答案是
DOWN
。
因为 A 段是单调上升的,B段是单调下降的。
那么当题目数据是 ABC 三段或者 CDE 三段呢?
很显然前者UP
,后者DOWN
。
因为无论前面怎么变,最后预测还是看最后一段上升或下降的曲线。
而判断一个曲线最后的方向,只需看两个数据,因为2个数据是最短的能够判断升降序的序列。
由此,我们得出一般性结论(敲黑板):
当前序列(\(\mathtt {len \ge 2}\))最后的升降序,由最后两个数据决定。
但是!
如果序列像 AB 或者 CD 呢?
由于 B 点和 D 点分别是峰顶和峰底,下面的数据会峰回路转,所以先进行对最后一个数据的判断:
如果这个数据是15,那么输出升序;
如果这个数据是0,那么输出降序。
还有一种特殊情况,当 \(len == 1\) 时,除上述为 15 和 0 的情况外,其他的数字都无法判断下面的是升序还是降序。理由就是2个数据是最短的能够判断升降序的序列。
分析结束,喜闻乐见上代码。
#include<bits/stdc++.h>
using namespace std;
int main() {
int va1,va2,n;
cin>>n;
for(int i=1;i<n;i++) cin>>va1;
cin>>va2;
if(va2==15) puts("DOWN");//特判1
else if(va2==0) puts("UP");//特判2
else if(n==1) puts("-1");//序列len==1,无法判断
else if(va2>va1) puts("UP");//升序
else puts("DOWN");//降序
return 0;
}
任何一个伟大的计划,都有一个微不足道的开始