列表

详情


NC18951. 两条斜线

描述

平面上有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

说明:

(1,3) (4,0) (4,2) (5,3)四个点都可以被经过

原站题解

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

Python3 解法, 执行用时: 551ms, 内存消耗: 13152K, 提交时间: 2023-03-06 09:20:29

from collections import defaultdict

n = int(input())
x = list(map(int,input().split()))
y = list(map(int,input().split()))

b1 = defaultdict(set)
b2 = defaultdict(set)
    
for i in range(n):
    b1[x[i]-y[i]].add(i)
    b2[x[i]+y[i]].add(i)
res = []
for i in b1.keys():
    for j in b2.keys():
        res.append(len(b1[i]|b2[j]))   
print(max(res))
    
    
    
    

C 解法, 执行用时: 400ms, 内存消耗: 436K, 提交时间: 2023-03-12 14:32:00

#include<stdio.h>
int main(){
	int n,i,j,k,t1,t2,ans,max=0;
	scanf("%d",&n);
	int x[n],y[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++){
		t1=y[i]-x[i];
		for(j=0;j<n;j++){
			ans=0;
			t2=y[j]+x[j];
			for(k=0;k<n;k++){
				if(y[k]-x[k]==t1||y[k]+x[k]==t2) ans++;
			}
			if(max<ans) max=ans;
		}
	}
	printf("%d",max);
} 

C++11(clang++ 3.9) 解法, 执行用时: 347ms, 内存消耗: 524K, 提交时间: 2020-01-17 15:12:04

#include<stdio.h>
int main()
{int n,i,j,k,a1,b1,t,s=0;
scanf("%d",&n);
int a[n],b[n];
 for(i=0;i<n;i++)
 scanf("%d",&a[i]);
 for(i=0;i<n;i++)
 scanf("%d",&b[i]);
   for(i=0;i<n;i++)
	{b1=a[i]-b[i];
	for(j=0;j<n;j++)
	{t=0;
	a1=a[j]+b[j];
	for(k=0;k<n;k++)
	if(a[k]+b[k]==a1||a[k]-b[k]==b1)
	t++;
	if(t>s)s=t;
	 } }
  printf("%d",s);
 } 

上一题