NC21800. 最佳射击
描述
输入描述
第一行输入一个整数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; }