抄的第一个大佬的题解,调教了3个小时,还是30分,求大佬调教
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+5;
int N,t1=0,t2=0,k=1; //N次失误,t1、t2分别为T、D失误次数
double v; //初始速度为1
double s=0,t=0; //s是当前的路程、t是当前的时间
double tim,dis; //tim是T[l]失误时的路程、dis是D[r]失误时的路程
char n;
int D[maxn]={0},T[maxn]={0}; //D数组是位移失误,T数组是时间失误
int main(){
cin>>N;
for(int i=1;i<=N;i++){
cin>>n;
if(n=='T'){
cin>>T[++t1]; //T、D分开存储
}else{
cin>>D[++t2];
}
}
sort(T+1,T+t1+1); //排序T数组
sort(D+1,D+t1+1); //排序D数组
T[t1+1]=0x3f3f3f3f;
D[t2+1]=0x3f3f3f3f;
int l=1,r=1; //l是T数组的下标、r是D数组的下标
while(l<=t1||r<=t2){
v=1.0/k;
tim=s+(T[l]*1.0-t)*v; //更新到T[l]失误时所用路程
dis=D[r]; //更新到D[r]失误时所用路程
if(tim<dis){ //如果是T类型失误
s=tim; //更新路程
t=T[l]; //更新时间
l++; //更新左指针
}else{ //如果是D类型失误
t+=(dis-s)/v; //时间增加:新增路程/速度
s=dis; //更新路程
r++; //更新右指针
}
k++; //更新速度的分母
}
t+=(1000-s)/(1.0/(k*1.0)); //加上剩余路程所需时间
cout<<int(t+0.5); //四舍五入取答案
return 0;
}