noi.ac 小W、小J和小Z

小z告诉小w了这样一道送分题。

在数轴上有nn个小人,第ii个人现在在pipi位置,速度是vivi(速度的正负代表不同的方向)。如果某一时刻两个人在同一位置,那么就会发生碰撞。

如果现在小j可以使用能力,使得其中kk个人凭空消失,那么最多会有多长时间内,没有任何两个人会碰撞呢?

输入格式

一行两个整数 nn和kk。

接下来 nn行,每行两个整数pi,vipi,vi,表示每个人的初始位置和速度。

输出格式

如果时间是无限长,输出Forever, 否则输出一个实数表示答案,答案误差小于10310−3即可。

样例一

input
4 1 
1 1 
3 -1 
5 2 
7 -2
output
1.00

样例二

input
4 2 
1 1 
3 -1 
5 2 
7 -2
output
Forever

数据范围和约定

本题采用捆绑测试,对于全部数据,1kn105;|pi|,|vi|109.1≤k≤n≤105;|pi|,|vi|≤109.

子任务编号分值nnkk
11020≤20n≤n
220200≤20010≤10
315n≤n
4152000≤200010≤10
520n≤n
620105≤105

时间限制:2s2s

空间限制:256MB

 

思路:二分+ 最长上升子序列

时间复杂度O(nlogn*logn) 

 

 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 #define F(i,a,b) for(int i=a;i<=b;i++) 
 5 #define D(i,a,b) for(int i=a;i>=b;i--) 
 6 #define ms(i,a)  memset(a,i,sizeof(a)) 
 7 #define LL       long long 
 8 
 9 int inline read(){
10     int x=0,w=0;  char c=getchar(); 
11     while (c<'0' || c>'9') w+=c=='-',c=getchar(); 
12     while (c>='0' && c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar(); 
13     return w? -x: x; 
14 }
15 
16 int const maxn=100003; 
17 double const  eps=1e-8; 
18 
19 int n,k; 
20 double b[maxn];  
21 struct people{
22     double p,v,x;  
23     bool operator < (const people & rhs) const{
24         return p<rhs.p;  
25     }
26 }a[maxn];  
27 
28 int check(double mid){
29     F(i,1,n) a[i].x=a[i].p+a[i].v*mid; 
30     sort(a+1,a+n+1);  
31     int t=0;
32     F(i,1,n){
33         if(!t || b[t]<a[i].x) b[++t]=a[i].x;  
34         if(t && fabs(b[t]-a[i].x)<eps) continue;  
35         int h=upper_bound(b+1,b+t+1,a[i].x)-b;
36         b[h]=a[i].x;  
37     }
38     return t+k>=n;  
39 }
40 
41 int main(){
42     n=read(); 
43     k=read();  
44     F(i,1,n) a[i].p=read(),a[i].v=read(); 
45     double l=0,r=2e9; 
46     F(i,1,100){
47         double mid=(l+r)/2; 
48         if (check(mid)) l=mid; 
49         else r=mid;  
50     }
51     if(fabs(r-2e9)<eps) printf("Forever\n"); 
52     else printf("%0.5f\n",l); 
53     return 0; 
54 }

 

 

转载于:https://www.cnblogs.com/ZJXXCN/p/9762570.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值