NBUT 2012 Weekly - 16th Mar for 12x

         这次出的两道题相当的水,纯粹是给大家增强信心用,好像也取得了预期的效果。

       [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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值