【BZOJ】【2765】【JLOI2010】铁人双项比赛
2015-05-13 11:13
155 查看
计算几何/半平面交
本来我是想去写POJ 1755的,然后想起了这道跟它很像的题,但应该是弱化版,所以就先写了这个……我们可以发现每个人的总用时,与k是呈一次函数关系的:$time_i=\frac{k}{Vrun_i}+\frac{S-k}{Vride_i}$
然而我们要找的是某个k,使得$min(time_n-time_i)$最大
那么就是一个线性规划问题了……这个也可以用半平面交来做……(蒟蒻并不会单纯形)
下面的部分为了偷懒简洁我就用$a_i$和$b_i$来代替两种速度……
我一开始想的做法是:维护一个$y=(\frac{1}{a_i}-\frac{1}{b_i})*x+\frac{S}{b_i}$的最小值(上凸壳?),然后由于线性分段函数的极值一定在分界点处取到(BZOJ 1038 瞭望塔),所以可以枚举分界点计算答案。
然而不会写……后来膜拜了lyd神犇的代码,发现:
这题$n\leq 100$,所以找到可能成为分界点的点,即所有直线的交点,暴力更新答案就好了……
然后还有一个地方是将不等式重新变形了一下,将第n条直线直接减到前面n-1条直线中……
无限ym……
/************************************************************** Problem: 2765 User: Tunix Language: C++ Result: Accepted Time:40 ms Memory:1276 kb ****************************************************************/ //BZOJ 2765 #include<cmath> #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #include<iomanip> #define rep(i,n) for(int i=0;i<n;++i) #define F(i,j,n) for(int i=j;i<=n;++i) #define D(i,j,n) for(int i=j;i>=n;--i) using namespace std; const int N=110; /*******************template********************/ typedef long double lf; #define eps 1e-12 int n,num; lf a ,b ,c ,d ,S,anst,ansk; void calc(lf k){ lf t=1e100; F(i,1,n-1) t=min(t,k*c[i]+d[i]); if (t>anst) anst=t,ansk=k; } int main(){ #ifndef ONLINE_JUDGE freopen("2765.in","r",stdin); // freopen("2765.out","w",stdout); #endif cin >>S>>n; F(i,1,n) cin >> a[i] >> b[i]; F(i,1,n-1){ c[i]=1/a[i]-1/b[i]-1/a +1/b ; d[i]=S/b[i]-S/b ; } anst=-1e100; F(i,1,n-1) F(j,i+1,n-1){ if (fabs(c[i]-c[j])<eps) continue; lf k=(d[j]-d[i])/(c[i]-c[j]); if (k<eps || k>S-eps) continue; calc(k); } calc(0); calc(S); anst*=3600; if (anst<-eps) puts("NO"); else{ if (anst<eps) anst=0; cout<<setprecision(2)<<fixed<<ansk<<' '<<S-ansk<<' '; cout<<setprecision(0)<<fixed<<anst<<endl; } return 0; }
View Code
2765: [JLOI2010]铁人双项比赛
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 477 Solved: 117
[Submit][Status][Discuss]
Description
铁人双项比赛是吉林教育学院的一项传统体育项目。该项目比赛由长跑和骑自行车组成,参赛选手必须先完成k公里的长跑,然后完成r公里的骑车,才能到达终点。
每个参赛选手所擅长的项目不同,有的擅长长跑,有的擅长骑车。如果总赛程s=k+r一定,那么K越大,对擅长长跑的选手越有利;k越小,对擅长骑车的选手
越有利。
现在给定总赛程s,以及每个选手长跑和骑车的平均速度,请你求出对于某个指定的选手最有利的k和r。所谓最有利,是指选择了这个k和r后,该选手可以获得冠军,且领先第2名尽量地多。
Input
你的程序从文件读入输入数据。输入的第一行是两个正整s和n,s表示总赛程(单位为公里,s≤231),n表示参赛总人数(2≤n≤100)。
接下来的n行每行是两个实数,分别表示每个选手长跑的平均速度和骑车的平均速度(单位为千米/小时)。
第n个选手就是指定的选手,你的任务是求出对他最有利的k和r。
Output
你的程序的输出包括三个数k,r, t,分别表示对第n号选手最有利的k和r(浮点数,保留小数点后2位),以及在选择k和r的情况下,第n号选手最多可以领先第2名多少秒(四舍五入到整数);如果另一个选手和该选手并列第一,则t i=0。倘若无论选择什么k,r都不能使第n号选手获胜,则输出“NO”。Sample Input
100 310.0 40.0
20.0 30.0
15.0 35.0
Sample Output
14.29 85.71 612HINT
Source
[Submit][Status][Discuss]相关文章推荐
- bzoj2765[JLOI2010]铁人双项比赛
- bzoj 2765: [JLOI2010]铁人双项比赛 (计算几何)
- bzoj2765: [JLOI2010]铁人双项比赛
- [BZOJ2756][JLOI2010]铁人双项比赛(半平面交+三分法)
- bzoj-2765 铁人双项比赛
- bzoj2765 铁人双项比赛
- bzoj2765 [JLOI2010]铁人双项比赛
- bzoj 2768: [JLOI2010]冠军调查
- bzoj2768[JLOI2010]冠军调查
- BZOJ 2768 [JLOI2010]冠军调查
- bzoj 2768: [JLOI2010]冠军调查 最小割
- BZOJ 2768: [JLOI2010]冠军调查 最小割
- bzoj 2768: [JLOI2010]冠军调查
- 【bzoj2768】【JLOI2010】【冠军调查】【最小割】
- 【bzoj2768/bzoj1934】[JLOI2010]冠军调查/[Shoi2007]Vote 善意的投票 最小割
- 【BZOJ2768】[JLOI2010]冠军调查/【BZOJ1934】[Shoi2007]Vote 善意的投票 最小割
- BZOJ 2768[JLOI2010]冠军调查
- BZOJ [JLOI2010]冠军调查
- bzoj2768 [JLOI2010]冠军调查(最小割,和bzoj1934一模一样)
- bzoj2768 [JLOI2010]冠军调查