闲话:赛时被D分类卡了很久 讨论了很多很傻逼的情况 但是就是没有想到交叉 赛后发现I其实更简单
D. Walker
虽然但是知道是分类讨论
不过还是很难知道他那三个情况咋想的
1.显然我们要是有一个超级快 我们可以先让他跑完小的一边再回过头跑长的一边
2.两个交叉跑过去 比如一个样例 1000 100 3 200 0.666
3.还有就是我们这两个在一个点“碰头” 当然不是真的碰头
就是左边点跑[0,mid] 右边点跑[mid,n]
这个我们可以直接二分时间 看看该时间内贪心的跑能不能碰头
bool check(double t){
if(t*v1<len1||t*v2<len3)return 0;
double l,r;
if(t*v1>3*len1){
l=t*v1-2*len1;
}else{
l=(t*v1-len1)/2;
}
if(t*v2>3*len3){
r=t*v2-2*len3;
}else{
r=(t*v2-len3)/2;
}
if(l+r>=len2)return 1;
else return 0;
}
void solve(){
double ans=2e9;
cin>>n>>p1>>v1>>p2>>v2;
if (p1 > p2) swap(p1, p2), swap(v1, v2);
len1=p1,len2=p2-p1,len3=n-p2;
ans=min({ans,(len1*2+len2*2+len3)/v2,(len1+len2+len3*2)/v2,
(len1*2+len2+len3)/v1,(len1+len2*2+len3*2)/v1});
ans=min(ans,max((len1+len2)/v2,(len2+len3)/v1));
double l=0,r=1e8;
while((r-l)>1e-8){
double mid=(l+r)/2;
if(check(mid)){r=mid;ans=min(ans,mid);}
else l=mid;
}
printf("%.10lf\n",ans);
}
I. Sky Garden
这道题就比较简单了 连mod都没有 划分集合都没有了
因为一个环 我们算了一个点 环上的点都是等价的 直接乘出来就可以了
而且范围还是500
直接暴力n3就可以了
其实随便改改都能变成O(1)的
因为其实你后面的点进来也不会改选择的方式
void solve(){
int n,m;cin>>n>>m;
//n层 pi/m
double ans=0;
if(m!=1){
ans+=n*m+n*n*m;
}
for(int i=1;i<=n;i++){
//tong cen
double res=0;
for(int j=1;j<m;j++){
res+=min((double)j/m*pi*i,(double)i*2);
}
res*=2;
res+=2*i;
res*=m;
ans+=res;
//nei cen
for(int j=i-1;j>=1;j--){
res=0;
for(int k=1;k<m;k++){
res+=i-j;
res+=min((double)k/m*pi*j,(double)j*2);
}
res*=2;
res+=i-j;
res+=i+j;
res*=2*m;
ans+=res;
}
}
printf("%.10lf\n",ans);
}
标签:Shanghai,Site,mid,len3,len2,len1,2020,ans,v2
From: https://www.cnblogs.com/ycllz/p/16943284.html