求助加速度小于a
查看原帖
求助加速度小于a
931309
Zz_pow楼主2024/11/21 22:37
#include<bits/stdc++.h>
using namespace std;
int t,v[1000005],a[1000005],m;
float d[100005],p[100005];
float n,l,vm;
struct pb{
	float d,v,a;
}ia[100005];
bool cmp(const pb s1,const pb s2){
	return s1.d>s2.d;
}
int main(){
	ios::sync_with_stdio(false);
	cin>>t;
	while(t--){
		memset(p,0,sizeof(p));
		memset(d,0,sizeof(d));
		memset(v,0,sizeof(v));
		memset(a,0,sizeof(a));
		memset(ia,0,sizeof(ia));
		cin>>n>>m>>l>>vm;
		int y=0,r=0,sum=0,mi=0,sp1=m;
		for(int i=1;i<=n;i++){
			int d1,a1,v1;
			cin>>d1>>v1>>a1;
			if(a1>=0){
				d[r]=d1,v[r]=v1,a[r]=a1;
				r++;
				continue;
			}
			ia[y].d=d1,ia[y].v=v1,ia[y].a=a1;
			y++;
		}
		for(int i=1;i<=m;i++)cin>>p[i];
		for(int i=0;i<r;i++){
			if(d[i]>p[m]) continue;
			if(a[i]==0){
				if(v[i]<=vm) continue;
				sum++,mi=1;
				continue;
			}
			float sx=sqrt(v[i]*v[i]+2*a[i]*(p[m]-d[i]));
			if(sx<=vm) continue;
			sum++,mi=1;
		}
		//大概思路:将加速度小于0的按照最靠北端进行排序,用sq1记录当前最远的一个公用的测速点,sq1默认为m,并找到最近的测速点;
		sort(ia,ia+y,cmp);
		for(int i=0;i<y;i++){
			if(ia[i].d>p[m]) i++;
			int u=lower_bound(p+1,p+m+1,ia[i].d)-p; //寻找到最近的测速点
			float wu=ia[i].v*ia[i].v+2*ia[i].a*(p[u]-ia[i].d);
			float wu2=ia[i].v*ia[i].v+2*ia[i].a*(p[sp1]-ia[i].d);//到达最远公用点是否超速
			if(wu<0) continue;
			float sx=sqrt(wu);
			if(sx<=vm) continue;
			sum++;
			if(wu2<0){    //无法到达最远测速点需要另开一个,优先选取最近的一个测速点
				mi++;
				sp1=u;
				continue;
			}
			float sx2=sqrt(wu2);
			if(sx2<=vm){  //无法到达最远测速点需要另开一个,优先选取最近的一个测速点
				mi++;
				sp1=u;
			}
		}
		cout<<sum<<' '<<m-mi<<endl;
	}
	return 0;
}
2024/11/21 22:37
加载中...