洛谷 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;
}
依旧是现在的代码风格

 

一世安宁

转载于:https://www.cnblogs.com/GTBA/p/9083314.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值