疑似模拟物理题哈
2025-10-08 19:37:54
发布于:北京
48阅读
0回复
0点赞
核心思路:
把需要测速的车放到car里
为了不爆时间
我们直接存储每辆车在car[i].first到car[i].second这两个测速仪之间超速(要用二分,详见代码)
最后贪心选择,每一个的左端是否在上一个已选择的测速仪之前
#include <bits/stdc++.h>
using namespace std;
int t,n,m,l,V,a[100010],d[100010],v[100010],p[100010];
bool check(int mid,int i){
int dis=p[mid]-d[i];
int yy=v[i]*v[i]+2*a[i]*dis;
return yy>V*V;
}
bool cmp(pair <int,int> a,pair <int,int> b){
if(b.second==a.second) return a.first<b.first;
return a.second<b.second;
}
vector <pair<int,int>> car;
int main(){
cin>>t;
while(t--){
cin>>n>>m>>l>>V;
car.clear();
int cnt=0,sum=0,lst=-1;
for(int i=1;i<=n;i++) cin>>d[i]>>v[i]>>a[i];
for(int i=1;i<=m;i++) cin>>p[i];
sort(p+1,p+m+1);
for(int i=1;i<=n;i++){
if(d[i]>p[m]) continue;
if(a[i]==0){
if(v[i]>V){
int x=lower_bound(p+1,p+m+1,d[i])-p;
car.push_back({x,m});
cnt++;
}
}
else if(a[i]<0){
int x=lower_bound(p+1,p+m+1,d[i])-p;
int dis=p[x]-d[i];
int yy=v[i]*v[i]+2*a[i]*dis;
if(yy>V*V){
cnt++;
int l=x,r=m,ans=-1;
while(l<=r){
int mid=(l+r)/2;
if(check(mid,i)){
ans=mid;
l=mid+1;
}
else r=mid-1;
}
car.push_back({x,ans});
}
}
else{
int x=lower_bound(p+1,p+m+1,d[i])-p;
int dis=p[m]-d[i];
int yy=v[i]*v[i]+2*a[i]*dis;
if(yy>V*V){
cnt++;
int l=x,r=m,ans=-1;
while(l<=r){
int mid=(l+r)/2;
if(check(mid,i)){
ans=mid;
r=mid-1;
}
else l=mid+1;
}
car.push_back({ans,m});
}
}
}
sort(car.begin(),car.end(),cmp);
for(int i=0;i<car.size();i++){
if(lst>=car[i].first) continue;
else{
sum++;
lst=car[i].second;
}
}
cout<<cnt<<" "<<m-sum<<endl;
}
return 0;
}
点个关注吧
主包写了好久
全部评论 4
ddd
1周前 来自 北京
1d
2025-10-08 来自 北京
1d
2025-10-08 来自 北京
1d
2025-10-08 来自 北京
1
有帮助,赞一个