• 奔跑的xiaodao


    http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=2086

     很明显的一个二分题目。因为要求精度颇高,所以需要认真的计算。

    比如我们看这3组数据——

    1 1 100 1000 1000 0 0 10000

    1 1 100 1 1 1000 1000 10000

    1 1 100 1 1 0 0 10000

    答案是——(在精度误差范围内)

    500000.0000000000

    500400000.00000000000000

    500000.00000000000

    标程的解法是二分相遇的时间,假设为 RunTime 这样就能够计算出DSxiaodao奔跑的时间Run1,Run2。这样就能计算出来两个人奔跑的距离和 RunLength = Run1 * v1 + Run2 * v2. 与 L 进行比较,最终确定奔跑时间RunTime。由于xiaodao一直在奔跑,于是最终的答案就是 RunTime * v.

    接下来就是细节问题,我们看最大的数据 RunTime 要将近1e9 的数量级,而我们要求精度误差是 1e-5.于是RunTime的上界设置为1e9因为我们的答案是 RunTime * v 所以精度eps最大为 1e-8 , 经过测试 1e-10、1e-9也是可以的。

    这个题目主要就在考验大家对于精度的计算问题,想清楚了比较简单。有些人直接二分答案,我不认为是个好方法。譬如二分xiaodao奔跑的距离 ans , 那么ans / v 的时候就会丧失很多精度,有可能会造成wa

     

    奔跑的xiaodao
    Time Limit: 4000 MS Memory Limit: 65536 K
    Total Submit: 149(17 users) Total Accepted: 47(11 users) Rating: Special Judge: Yes
    Description

    某天,DS同学和他的妹子终于要见面了。DS在遥远的西藏,妹子在北京,中间隔着一条长长的川藏公路。DS和妹子都在这条公路上相向而行,因为过于思念对方,DS派出了xiaodao作为自己的情书信使。

    DS和妹子相向而行,速度为 v1 , v2 m/s 尽职尽责的xiaodao同学以 v m/s 的速度奔跑,他一开始拿着DS的信向妹子的方向狂奔,遇到妹子之后毫不停歇,拿着妹子的书信继续以 v 的速度向DS奔跑,周而复始,一直到DS和妹子相遇为止。好辛劳的xiaodao

    但是DS是个胖子,妹子是女生,大家都体力不太行。已知DS奔跑 T1 s 之后就要休息 Wait1 s ,妹子奔跑 T2 s 之后就要休息 Wait2 s 。而xiaodao是不会休息的!经过计算,DS和妹子的初始距离为 L

    xiaodao想问你,当DS和妹子终于相遇的时候,xiaodao这时候已经奔跑了多少 m 的距离。

    Input

    第一行一个整数 T 代表数据组数,以下 T 组数据。

    每组数据包含 8 个实数 分别代表 v1 , v2 , v , T1 , T2 , Wait1 , Wait2 , L

    1 <= v1 , v2 <= 100 , v1 < v <= 100 , 1 <= T1 , T2 <= 1000 , 0 <= Wait1 , Wait2 <= 1000 . 1 <= L <= 10000 .

    Output

    对于每组数据输出一个实数 S 代表 xiaodao 奔跑的距离。
    如果标程给出的答案是 Ans 只要 | Ans - S | < 1e-5 你就会得到 Accepted

    Sample Input
    1
    1.00 1.00 2.00 1.00 1.00 0.00 0.00 2.00
    
    Sample Output
    2.000000000
    

     

    #include<iostream>
    #include<math.h>
    #include<cmath>
    #include<stdio.h>
    using namespace std;
    double v1,v2,v,t1,t2,w1,w2;
    long long T;
    double l,r,mid,ans,len;
    double minn(double aa,double bb)
    {
    	if (aa>bb)return bb;
    	else return aa;
    }
    void judge(){//为什么还要判断一下是否减去最短的休息时间。
    	double r1,r2,dds,dmz,time1,time2;
    	dds=0.00;dmz=0.00;
    	r1=floor(mid/(t1+w1));
    	r2=floor(mid/(t2+w2));
    	dds=r1*t1*v1;dmz=r2*t2*v2;
    	if (abs(len-dds-dmz)<1e-9){
    		mid-=minn(w1,w2);//为什么减去最短的
    		 return;
    	}
    	return ;
    }
    bool ok (double time)
    {
    	double r1,r2,dds,dmz,time1,time2;
    	dds=0.00;dmz=0.00;
    	r1=floor(time/(t1+w1));
    	r2=floor(time/(t2+w2));
    	dds=r1*t1*v1;dmz=r2*t2*v2;
    	time1=time-r1*(t1+w1);
    	time2=time-r2*(t2+w2);
    	time1=minn(time1,t1);time2=minn(time2,t2);
    	dds+=time1*v1;dmz+=time2*v2;
    	if (dds+dmz>len) return true;
    	return false;
    }
    int main()
    {
    	cin>>T;
    	double ds1,ds2,mz1,mz2;
    	while (T--){
    		l=0.00;
    		r=10000000000.00;
    		cin>>v1>>v2>>v>>t1>>t2>>w1>>w2>>len;
    		while (r-l>1e-9)
    		{
    			mid=(l+r)*0.5;
    			if (ok(mid)) r=mid;
    			else l=mid;
    		}
            judge();
    		ans=mid*v;
    		printf("%.8lf
    ",ans);
    	}
    	return 0;
    }
    

     

      

     

  • 相关阅读:
    从新浪财经获取金融新闻类数据并进行打分计算
    SQL窗口函数的用法总结
    从新浪财经获取金融新闻类数据并保存到MySQL
    [ZJOI2015]幻想乡战略游戏
    二次剩余入门
    [多校赛20210406]迫害 DJ
    [NOI Online 2021 提高组] 愤怒的小N
    [NOI Online 2021 提高组] 岛屿探险
    「UNR #3」百鸽笼
    [ZJOI2019]开关
  • 原文地址:https://www.cnblogs.com/cancangood/p/3641115.html
Copyright © 2020-2023  润新知