#include <bits/stdc++.h>
using namespace std;
//枚举每个点,考虑其横向删除和纵向删除的情况来枚举剩余的点,
// 0 1 2 3表示上右下左
//复杂度为o(n方)
int get(vector<long long>x,vector<long long>vx,int n){
//先考虑竖着切的时候,即考虑横坐标变化
int ans=1;
for(int i=1;i<=n;i++){
unordered_map<long long,int>haxi;
int cnt=1;//无论什么时候都会跟着i的飞机,其本身算一个
for(int j=1;j<=n;j++){
if(i==j)continue;
int d=x[i]-x[j];
//统一右为正,速度也是右为正
int dv= vx[j]-vx[i];
//负距正速,正距负速才能相交
if(dv==0){//如果距离为0要么无解要么无穷多解
if(d!=0)continue;//无解
cnt++;//无穷多解
}
else{
long long t=d/dv;//正确的计算,有一个为负才能追上
if(t<0||d%dv!=0)continue;//如果不是正或者不是整数无解
haxi[t]++;
}
}
ans=max(ans,cnt);//先考虑一架都没有的情况先
for(auto &it : haxi){
ans=max(ans,it.second+cnt);
}
}
return ans;
}
int main(){
int n;
int ans=1;
scanf("%d",&n);
vector<long long>x(n+1);
vector<long long>vx(n+1);
vector<long long>y(n+1);
vector<long long>vy(n+1);
for(int i=1;i<=n;i++){
long long x0,y0,v;
char c;
scanf("%d %d %d %c",&x0,&y0,&v,&c);
x[i]=x0;y[i]=y0;
if(c=='U'){
vx[i]=0;
vy[i]=v;
}
else if(c=='D'){
vx[i]=0;
vy[i]=-v;
}
else if(c=='R'){
vx[i]=v;
vy[i]=0;
}
else if(c=='L'){
vx[i]=-v;
vy[i]=0;
}
//else cout<<"cnm"<<endl;
}
//solve
ans=max(ans,get(x,vx,n));
ans=max(ans,get(y,vy,n));
printf("%lld",ans);
return 0;
}
改了一整天,发现将d,dv的数据类型由long long 改成int就通过了。但我还是不明白,为什么int可以long long却不行。