列表

详情


NC21800. 最佳射击

描述

平面直角坐标系上有一些点,你可以进行0或者若干次操作
每次操作可以将所有的点往某个方向平移
也可以将所有的点绕着(0,0)旋转任意角度

你射击一枪能够射到x轴与y轴上的所有点,你希望经过若干次操作后,射击一枪能击中尽可能多的点,求最多可以击中几个点

输入描述

第一行输入一个整数n (1 ≤ n ≤ 50)
第二行输入n个整数表示x坐标
第三行输入n个整数表示y坐标
(坐标的范围在[-1000000,1000000]之间)

输出描述

输出一个整数

示例1

输入:

2
0 5
0 5

输出:

2

示例2

输入:

5
0 -1 1 1 -1
0 -1 -1 1 1

输出:

5

示例3

输入:

9
0 -3 3 3 -3 0 0 3 -3
0 -3 -3 3 3 3 -3 0 0

输出:

5

原站题解

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

C++(g++ 7.5.0) 解法, 执行用时: 43ms, 内存消耗: 556K, 提交时间: 2023-07-29 11:19:52

#include<bits/stdc++.h>
using namespace std;
const int M=55;
int i,j,k,l,n,m,x[M],y[M],Max;
int main(){
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&x[i]);
	}
	for(i=1;i<=n;i++)
	{
		scanf("%d",&y[i]);
	}
	if(n<=3)
	{
		printf("%d\n",n);
		return 0;
	}
	for(i=1;i<=n;i++)
	{
		for(j=1;(j<=n);j++)
		{
			if(j==i)	
                    continue;
			for(k=1;(k<=n);k++)
			{
				if(k==i||k==j)	
					continue;
				m=0;
				for(l=1;l<=n;l++)
				{
					if(l==i||l==j||l==k)	
						continue;
					if((x[i]-x[j])*(x[k]-x[l])==-(y[i]-y[j])*(y[k]-y[l]))
						m++;
					else if((x[i]-x[l])*(y[l]-y[j])==(y[i]-y[l])*(x[l]-x[j]))
						m++;
				}
				Max=max(Max,m);
			}
		}
	}
	printf("%d\n",Max+3);
}

pypy3(pypy3.6.1) 解法, 执行用时: 191ms, 内存消耗: 23544K, 提交时间: 2021-01-21 16:41:58

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

r = []
Max = 0
m = 0
if n <= 3:
    print(n)
else:
    for i in range(n):
        for j in range(n):
            for k in range(n):
                m = 0
                for l in range(n):
                    if(i==j or i==k or i==l or j==k or j==l or k==l):
                        continue
                    if((x[i]-x[j])*(x[k]-x[l])==-(y[i]-y[j])*(y[k]-y[l])):  # 与ij垂直
                        m += 1 
                    elif((x[i]-x[l])*(y[l]-y[j])==(y[i]-y[l])*(x[l]-x[j])):  # 与ij平行
                        m += 1 
                Max = max(Max, m)
    print(Max + 3)

C++14(g++5.4) 解法, 执行用时: 16ms, 内存消耗: 380K, 提交时间: 2019-02-25 11:04:58

#include<stdio.h>
#include<math.h>
#define fo(i,a,b) for(int i=a;i<=b;i++)
int n,te,ans;
const double eps=1e-5;
double x[60],y[60],A1,B1,C1,A2,B2,C2;
int main(){
	scanf("%d",&n);
	if (n<=2){
		printf("%d\n",n);
		return 0;
	}
	fo(i,1,n) scanf("%lf",&x[i]);
	fo(i,1,n) scanf("%lf",&y[i]);
	ans=2;
	fo(i,1,n-1)
		fo(j,i+1,n){
			if (fabs(x[i]-x[j])<eps){
				A1=1;B1=0;C1=-x[i];
			}else{
				A1=(y[i]-y[j])/(x[i]-x[j]);B1=-1;C1=-A1*x[i]-B1*y[i]; 
			}
			fo(k,1,n){
				A2=-B1;B2=A1;C2=-x[k]*A2-y[k]*B2;
				te=0;
				fo(l,1,n) if (fabs(A1*x[l]+B1*y[l]+C1)<eps||fabs(A2*x[l]+B2*y[l]+C2)<eps) te++;
				if (te>ans) ans=te;
			}
		}
	printf("%d\n",ans);
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 44ms, 内存消耗: 620K, 提交时间: 2020-03-06 22:51:30

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int a[100],b[100],m,n,i,j,k,l,MAX=0;
	cin>>n;
	if(n<=3)
	{
		cout<<n;
		return 0;
	}
	for(i=0;i<n;i++) cin>>a[i];
	for(i=0;i<n;i++) cin>>b[i];
	for(i=0;i<n;i++)
	for(j=0;j<n;j++)
	for(k=0;k<n;k++)
	{
		m=0;
		for(l=0;l<n;l++)
		{
			if(i==j||i==k||i==l||j==k||j==l||k==l) continue;
		    if((a[i]-a[j])*(a[k]-a[l])==-(b[i]-b[j])*(b[k]-b[l])) m++;
		    else if((a[i]-a[j])*(b[i]-b[l])==(a[i]-a[l])*(b[i]-b[j])) m++;
		}
		MAX=max(m,MAX);
	}
	cout<<MAX+3;
	return 0;
}

上一题