[E] Endless Tree 【链接】
这道题是一个签到题,只要能够读懂就能秒杀。题目是说,你和你的队友被随机传送到这个无穷大二叉树的另个结点中,并且你的队友的结点编号总是大于你。求你应该在哪个位置等待他的buff的到来。首先一个结点到根节点的路径是唯一的,加上你和队友都只能向前走,这就说明所要求的是两条路径的第一个公共子节点。一个结点上一层的编号总是n/2,所以就可以这样做:挑选编号较大者,除以二,直到两个数字相等,即为答案。
#include<iostream>
using namespace std;
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
while(n != m)
{
if(n > m) n /= 2;
else m /= 2;
}
printf("%d\n",n);
}
return 0;
}
[I Hate Math]【 链接 】
这是一道纯粹的数学题。原本是想出一道“三分查找”的题目,可是因为这种算法没用过多少次,没想到它的精度挺糟糕,导致一开始数据出现问题,为此我表示抱歉。那么就中规中矩的去解好了。
首先对函数求导:f'(x) = 10x^4+12x^3+12x^2-k. 因为x的取值范围是[0,100],所以这个导函数除了最后减去k外均大于等于零。那么就可以分情况讨论了(讨论范围只限于[0,100]):
①f'(0)>=0,那么导数恒不小于零,f(x)单调递增,所以f(x)在x=0处取得最小值。
②f'(100)<=0,那么导数恒不大于零,f(x)单调递减,所以f(x)在x=100处取得最小值。
③除①②种情况外,f'(x) = 0的解落在给定的定义域内,并且由f'(x)得f(x)先递减后递增,所以要先用二分法求得f'(x)=0的解,得到x=T,带回原函数即f(T)即为所求的最小值。
#include<iostream>
using namespace std;
double k;
#define eps 1e-8
double cal(double x)
{
return 2*x*x*x*x*x + 3*x*x*x*x + 4*x*x*x + 5*x*x - k*x;
}
double daoshu(double x)
{
return 10*x*x*x*x + 12*x*x*x + 12*x*x + 10*x -k;
}
int main()
{
while(~scanf("%lf",&k))
{
double a = 0;
double b = 100;
if(daoshu(0) >= 0)
printf("%.3lf\n",cal(0));
else if(daoshu(100) <= 0)
printf("%.3lf\n",cal(100));
else
{
while(a + eps < b)
{
double mid = (a + b)/2;
if(daoshu(mid) > 0)
b = mid;
else
a = mid;
}
printf("%.3lf\n",cal(a));
}
}
return 0;
}