自古神题出(于)浙江。。。o(╯□╰)o。好吧首先给出结论
ans={1(n=1),2*(k,n-k+1)}
怎么得来的呢。。。大概是这样(我自己yy的不要轻信,不考虑n=1):
由于这个图从上到下和从下到上是一样的,因此如果当k>[(n+1)/2]时,将整个图翻转就能使k<=[n/2]了,因此我们只需要考虑让靠下面的尽量少就行了。下面用归(luan)纳(shuo)法(de)来证明:
当k=1时,显然,答案等于2,而且那两段必然是斜率的绝对值最大的(其实也不一定,如果一正一负,那就是斜率为正的和负的的直线中各自绝对值最大的;否则如果同号,就是最大的两个);
当k>1时,考虑k-1,此时第k-1那几段和其它直线的相交不影响第k层(因为相交的点的下方是k-2层及以下的),换句话说和这几段相交的直线在交点以下的部位直接无视;那么在上面的部分,由于已经有2*(k-1)段,所以必然对应2*(k-1)条直线(和原来的直线不是一个东西),然后要和上面的相交。那么我们最好让它在中间不要相交,但是在两端必然会相交,会多出两端,也至少要多出两端。因此此时为2k。
AC代码如下(这种题目还放代码。。):
#include<cstdio>
#include<iostream>
using namespace std;
int main(){
int n,k; scanf("%d%d",&n,&k);
printf("%d\n",(n==1)?1:min(k,n-k+1)<<1);
}
by lych
2016.2.3