列表

详情


NC21670. 两条公路

描述

平面上有n个点,现在你需要建造两条路,一条是斜率为1,
另一条斜率为-1
你的任务是让这两条路经过尽可能多的点
求最多经过几个点

输入描述

第一行输入一个整数n

第二行输入n个整数表示x坐标

第三行输入n个整数表示y坐标

数据保证没有重点

1 ≤ N ≤ 1000,0 ≤ x[i],y[i] ≤ 999

输出描述

输出一个整数

示例1

输入:

4
1 4 4 5
3 0 2 3

输出:

4

示例2

输入:

6
0 1 2 3 4 5
2 2 2 2 2 2

输出:

2

示例3

输入:

4
2 2 3 3 
2 3 2 3 

输出:

4

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Python3 解法, 执行用时: 509ms, 内存消耗: 6512K, 提交时间: 2023-05-24 13:19:52

n = int(input())
x_ = list(map(int,input().split()))
y_ = list(map(int,input().split()))
z = {}
f = {}
for i in range(n):
    z1 = y_[i]-x_[i]
    f1 = y_[i]+x_[i]
    if z1 not in z:
        z[z1] = set()
    if f1 not in f:
        f[f1] = set()
    z[z1].add(i)
    f[f1].add(i)
ans = 0
for i in z.values():
    for j in f.values():
        daan = len(i|j)
        ans = max(ans,daan)
print(ans)

C(clang 3.9) 解法, 执行用时: 398ms, 内存消耗: 376K, 提交时间: 2019-03-18 19:26:17

#include<stdio.h>
int x[1001],y[1001],i,j,m,n,b1,b2,sum,max=0;
int main()
{
	scanf("%d",&n);
	for(i=0;i<n;i++)scanf("%d",&x[i]);
	for(i=0;i<n;i++)scanf("%d",&y[i]);
    for(i=0;i<n;i++)
	{			
		b1=y[i]-x[i];
		for(j=0;j<n;j++)
		{
			b2=x[j]+y[j];
			for(sum=0,m=0;m<n;m++)
			{
				if(y[m]-x[m]==b1||y[m]+x[m]==b2)sum++;
			}
			if(sum>max)max=sum;
		}
	}
	printf("%d",max);
	return 0;
}

C++(clang++ 11.0.1) 解法, 执行用时: 412ms, 内存消耗: 464K, 提交时间: 2022-10-26 20:49:52

#include <iostream>
using namespace std;
int main(){
int a[1010],b[1010];
int n,cnt=0,maxx=0,p=0,q=0;
cin>>n;
for(int i=0;i<n;i++) {cin>>a[i];}
for(int i=0;i<n;i++) {cin>>b[i];}
for(int i=0;i<n;i++){
p=b[i]-a[i];
for(int j=0;j<n;j++){cnt=0;q=b[j]+a[j];
for(int k=0;k<n;k++){
if(b[k]-a[k]==p||b[k]+a[k]==q)
cnt++;}
maxx=max(maxx,cnt);
}
}
cout<<maxx<<endl;
return 0;
}

上一题