本来我是想去写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……

 1 /**************************************************************
 2     Problem: 2765
 3     User: Tunix
 4     Language: C++
 5     Result: Accepted
 6     Time:40 ms
 7     Memory:1276 kb
 8 ****************************************************************/
 9  
10 //BZOJ 2765
11 #include<cmath>
12 #include<cstdio>
13 #include<cstring>
14 #include<cstdlib>
15 #include<iostream>
16 #include<algorithm>
17 #include<iomanip>
18 #define rep(i,n) for(int i=0;i<n;++i)
19 #define F(i,j,n) for(int i=j;i<=n;++i)
20 #define D(i,j,n) for(int i=j;i>=n;--i)
21 using namespace std;
22  
23 const int N=110;
24 /*******************template********************/
25 typedef long double lf;
26 #define eps 1e-12
27 int n,num;
28 lf a[N],b[N],c[N],d[N],S,anst,ansk;
29  
30 void calc(lf k){
31     lf t=1e100;
32     F(i,1,n-1) t=min(t,k*c[i]+d[i]);
33     if (t>anst) anst=t,ansk=k;
34 }
35  
36 int main(){
37 #ifndef ONLINE_JUDGE
38     freopen("2765.in","r",stdin);
39 //  freopen("2765.out","w",stdout);
40 #endif
41     cin >>S>>n;
42     F(i,1,n) cin >> a[i] >> b[i];
43     F(i,1,n-1){
44         c[i]=1/a[i]-1/b[i]-1/a[n]+1/b[n];
45         d[i]=S/b[i]-S/b[n];
46     }
47  
48     anst=-1e100;
49     F(i,1,n-1) F(j,i+1,n-1){
50         if (fabs(c[i]-c[j])<eps) continue;
51         lf k=(d[j]-d[i])/(c[i]-c[j]);
52         if (k<eps || k>S-eps) continue;
53         calc(k);
54     }
55     calc(0); calc(S);
56     anst*=3600;
57     if (anst<-eps) puts("NO");
58     else{
59         if (anst<eps) anst=0;
60         cout<<setprecision(2)<<fixed<<ansk<<' '<<S-ansk<<' ';
61         cout<<setprecision(0)<<fixed<<anst<<endl;
62     }
63     return 0;
64 }
View Code

相关文章:

  • 2021-11-07
  • 2022-01-28
  • 2021-06-22
  • 2021-05-19
  • 2022-12-23
  • 2021-05-11
  • 2021-04-19
  • 2022-02-23
猜你喜欢
  • 2021-10-15
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-12-19
  • 2021-05-01
相关资源
相似解决方案