1432: [ZJOI2009]Function
Description
Input
一行两个整数n; k。
Output
一行一个整数,表示n 个函数第k 层最少能由多少段组成。
Sample Input
1 1
Sample Output
1
HINT
对于100% 的数据满足1 ≤ k ≤ n ≤ 100。
很明显这是一道结论题。又是愣没想出来,以下来自:http://blog.csdn.net/zmoiynlp/article/details/44226459
n=1的时候输出1,其余时候输出2*k,
假如k>(n>>1)的话,令k=n-k+1(因为1和n-1是对称的)。
为什么呢……
我们画一个图。(这个图是很经典的)
这是5条直线(函数)。可以看到,这些点以
A
BC
DEF
GHIJ
的方式排列。
第一个部分只经过A(这样一定是最优的)
第二个部分只经过BAC
第三个部分只经过DBECF……
1
1+2
2+3
3+4……
线段数比点数多一,所以就是
2
4
6
8……
特别地,当n=1时是1。
当然,对于结论题,代码往往都很短……
当时图已经画出来了,但因为题目中的“连续函数”(天知道是不是线性的),卡了很久。但现在一想,只有线性最优啊……
我又先看了题解,罪过啊……
1 /************************************************************** 2 Problem: 1432 3 User: Doggu 4 Language: C++ 5 Result: Accepted 6 Time:0 ms 7 Memory:820 kb 8 ****************************************************************/ 9 10 #include <cstdio> 11 #include <algorithm> 12 int n, k, a; 13 int main() { 14 scanf("%d%d",&n,&k); 15 if(n==1) a=1; 16 else if(k<=(n>>1)) a=2*k; 17 else a=2*(n-k+1); 18 printf("%d ",a); 19 return 0; 20 }