星际青蛙(弱弱版)
背景
在3XXX年,青蛙占领了整个宇宙。有一天,两个种族的青蛙在一个虫洞相遇了。
由于,虫洞开启只有2S时间,且距离有几十万光年,虽然青蛙种族有超强的飞行器(有级强的防撞装甲),但是虫洞的大小不允许两个种族同时通过,所以他们在虫洞的中间相撞了。(以几亿倍的光速飞行相撞,不知会不会造成时空扭曲d-.-!)
没有办法,他们只能从飞行器中出来,跳到对方的飞行器里,交换飞行。
描述
在两族之间有一个空地,青蛙每次可以向前跳一步,也可以借助前面青蛙的背,跳到前面青蛙的前面一格(这格必须无青蛙),因为两族青蛙都互不相让,所以无法掉头向后跳。请你在1S内,算出所有青蛙到对方飞行器至少要跳几步?
格式
输入格式
输入X,X为每族青蛙的“蛙”数。(X<=2500)
输出格式
输出M,M为最少步数。(m<=无穷大)
样例1
样例输入1
1
样例输出1
3
限制
1S
提示
样例的跳法(*表示种族X,o表示种族Y)
原始:*_o
第1步:_*o
第2步:o*_
第3步:o_*
#include<bits/stdc++.h>
using namespace std;
int main (){
int n;
cin>>n;
int sum=n*(n+2);
cout<<sum<<endl;
return 0;
}
额…转下别人的证明,的确很弱….
最少步数的前提
1:在任何一步中,两族青蛙的状态或不动或向对方运动
2:任何一步都是可逆的
设n为每族青蛙的“蛙”数
A:先不考虑‘借助前面青蛙的背,跳到前面青蛙的前面一格’的情况,即每次只能跳1格(此时假设多只青蛙可以站在同一格),那么任何一族的所有青蛙共需要跳n*(n+1)次(平均思想,即平均每只都跳n+1次),所以两族一共要跳2*n*(n+1)次;
B:但是由于‘多只青蛙可以站在同一格’是有悖与题目的,所以再来考虑‘借助前面青蛙的背,跳到前面青蛙的前面一格’的情况。这种情况每发生一次,有一只青蛙就可以跳2个,即可以比A少跳1次。又因为两族的青蛙都会一对一的挡在对方前面,所以共有n*n次情况发生,即可以比A少跳n*n次。同时,这种情况不会多于n*n,原因如下:
若有一只青蛙跳了n次后,还要跳一次,那么他有2种选择:
1.跳到对方青蛙:这样,就不满足前提1
2.跳过对方青蛙:这样,就不满足前提2(况且他的前面是不会有空位的,因为无法产生这种空位,例:00_xx —|> _xx00 是不可能的~~~)
综上所述,最少步数m=2*n*(n+1)-n*n=n*n+2*n