• 洛谷 P1142 轰炸


                        洛谷 P1142 轰炸

    题目描述

    “我该怎么办?”飞行员klux向你求助。

    事实上,klux面对的是一个很简单的问题,但是他实在太菜了。

    klux要想轰炸某个区域内的一些地方,它们是位于平面上的一些点,但是(显然地)klux遇到了抵抗,所以klux只能飞一次,而且由于飞机比较破,一点起飞就只能沿直线飞行,无法转弯。现在他想一次轰炸最多的地方。

    输入输出格式

    输入格式:

    第一行为n

    输入数据由n对整数组成(1<=n<=700),每对整数表示一个点的坐标。没有一个点会出现两次。

    输出格式:

    一个整数,表示一条直线能覆盖的最多的点数。

    输入输出样例

    输入样例#1: 
    5
    1 1
    2 2
    3 3
    9 10
    10 11
    
    输出样例#1: 
    3
    

    说明

    本题翻译并改编自uva270,数据及解答由uva提供。

    题解:

    主要就是暴力枚举和判断两点是否在同一条直线上啊;

    找到公式就好了。

    (x[zzz]-x[z])*(y[zzz]-y[zz])==(y[zzz]-y[z])*(x[zzz]-x[zz])

    90分,TLE了一个点。

     1 #include<cstdio>
     2 int max(int x,int y)
     3 {
     4     return x>y?x:y;
     5 }
     6 int x[1007],y[1007];
     7 bool check(int z,int zz,int zzz)
     8 {
     9     return (x[zzz]-x[z])*(y[zzz]-y[zz])==(y[zzz]-y[z])*(x[zzz]-x[zz])?true:false;
    10 }
    11 int n,ans,answer=0;
    12 int main()
    13 {
    14     scanf("%d",&n);
    15     for(int i=1; i<=n; i++)
    16         scanf("%d%d",&x[i],&y[i]);
    17     for(int i=1; i<n; i++)
    18     {
    19         for(int j=i+1; j<=n; j++)
    20         {
    21             ans=2;
    22             for(int k=1; k<=n; k++)
    23             {
    24                 if(k==i||k==j) continue;
    25                 if(check(i,j,k)) ans++;
    26             }
    27             answer=max(answer,ans);
    28         }
    29     }
    30     printf("%d",answer);
    31     return 0;
    32 }
    33 /*
    34 5
    35 1 1
    36 2 2
    37 3 3
    38 9 10
    39 10 11
    40 
    41 3
    42 */
    过去的代码风格
     1 #include<cstdio>
     2 int max(int x,int y) {
     3     return x>y?x:y;
     4 }
     5 int x[1007],y[1007];
     6 bool check(int z,int zz,int zzz) {
     7     return (x[zzz]-x[z])*(y[zzz]-y[zz])==(y[zzz]-y[z])*(x[zzz]-x[zz])?true:false;
     8 }
     9 int n,ans,answer=0;
    10 int main() {
    11     scanf("%d",&n);
    12     for(int i=1; i<=n; i++)
    13         scanf("%d%d",&x[i],&y[i]);
    14     for(int i=1; i<n; i++) {
    15         for(int j=i+1; j<=n; j++) {
    16             ans=2;
    17             for(int k=1; k<=n; k++) {
    18                 if(k==i||k==j) continue;
    19                 if(check(i,j,k)) ans++;
    20             }
    21             answer=max(answer,ans);
    22         }
    23     }
    24     printf("%d",answer);
    25     return 0;
    26 }
    27 /*
    28 5
    29 1 1
    30 2 2
    31 3 3
    32 9 10
    33 10 11
    34 
    35 3
    36 */
    现在的代码风格

    然后,不用函数,并且输出改成cout,就A了,,,

    学长好像讲过,cout输出数字比printf快

    #include<cstdio>
    #include<iostream>
    int max(int x,int y) {
        return x>y?x:y;
    }
    int x[707],y[707];
    int n,ans,answer=0;
    int main() {
        scanf("%d",&n);
        for(int i=1; i<=n; i++)
            scanf("%d%d",&x[i],&y[i]);
        for(int i=1; i<n; i++) {
            for(int j=i+1; j<=n; j++) {
                ans=2;
                for(int k=1; k<=n; k++) {
                    if(k==i||k==j) continue;
                    if((x[k]-x[i])*(y[k]-y[j])==(y[k]-y[i])*(x[k]-x[j])) ans++;
                }
                answer=max(answer,ans);
            }
        }
        std::cout<<answer;
        return 0;
    }
    依旧是现在的代码风格

    一世安宁

  • 相关阅读:
    CCNP-MPLS-标签交换
    Mac地址表、STP与RSTP原理
    mysql 初始数据库简单操作
    异步回调,事件,线程池与协程
    bug问题
    GIL 线程池
    异常处理
    奇怪的东西
    绑定方法
    初体验
  • 原文地址:https://www.cnblogs.com/GTBA/p/9083314.html
Copyright © 2020-2023  润新知