这道题要注意细节,很容易出错.根据函数y=x+c;y=-x+c;用两个哈希表统计同一条直线的点数,然后再用一个循环找出现最多的点,同时要注意两条公路重合的地方,写一个max_num函数来统计。 代码如下:

using namespace std;
int n;
vector<int> x,y;
unordered_map<int,int> mp1,mp2;
int ans=0;
int max_num(int a,int b){
    int cnt=0;
    for(int i=0;i<n;++i){
        if(y[i]-x[i]==a||y[i]+x[i]==b){
            cnt++;
        }
    }
    return cnt;
}
signed main()
{
    cin>>n;
    x.resize(n);y.resize(n);
    for(int i=0;i<n;++i)cin>>x[i];
    for(int i=0;i<n;++i)cin>>y[i];
    for(int i=0;i<n;++i){
        mp1[y[i]-x[i]]++;
        mp2[y[i]+x[i]]++;
    }
    for(auto it1=mp1.begin();it1!=mp1.end();++it1){
        for(auto it2=mp2.begin();it2!=mp2.end();++it2){
            ans=max(ans,max_num(it1->first,it2->first));
        }
    }
    cout<<ans;
    return 0;
}