30分可爱小猫娘求调教
查看原帖
30分可爱小猫娘求调教
388037
独孤求败的剑楼主2024/11/26 22:04

抄的第一个大佬的题解,调教了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;
}
2024/11/26 22:04
加载中...