bzoj1432 function 数学推导

       自古神题出(于)浙江。。。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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值