可见矩形

题目描述

给定平面上n个互不相交(指公共面积为零)的正方形,它们的顶点坐标均为整数。设坐标原点为O(0, 0)。对于任一正方形R,如果可以找到R的边上2个不同的点A和B,使三角形OAB的内部与其他正方形无公共点,则称正方形R是从O点可见的正方形。

对于给定的n个互不相交的正方形,计算从坐标原点O可见的正方形个数。

输入格式

输入文件的第一行是正方形个数n(1≤n≤1000)。

接下来n行中,每行有3个表示正方形的整数X,Y,L。其中,X和Y表示正方形的左下角顶点坐标,L表示边长,1≤X, Y, L≤10000。

输出格式

输出文件仅有一行包含一个整数,表示从坐标原点O可见的正方形个数。

输入输出样例

输入 #1
3
2 6 4
1 4 1
2 4 1
输出 #1
3

分析:
本题不难做,就是用斜率来代替即可,只要学过初中数学应该都会,但是目测我的代码依旧10分,求大佬指教。

CODE:
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int M=20005;
int n,ans;
struct node{
    int x,y,l;
}a[M];
struct node1{
    double k1,k2;
}b[M];
int get(){
    int res=0,f=1;
    char c=getchar();
    while (c>'9'||c<'0') {
        if (c=='-') f=-1;
        c=getchar();
    }
    while (c<='9'&&c>='0'){
        res=(res<<3)+(res<<1)+c-'0';
        c=getchar();
    }
    return res*f;
}
bool cmp(node xx,node yy){
    if (xx.x==yy.x) return xx.y<yy.y;
    else return xx.x<yy.x;
}
int main(){
    n=get();
    for (int i=1;i<=n;i++) a[i].x=get(),a[i].y=get(),a[i].l=get();
    sort(a+1,a+n+1,cmp);
    for (int i=1;i<=n;i++){
        b[i].k1=(a[i].y+a[i].l)*1.0/a[i].x;
        b[i].k2=a[i].y*1.0/(a[i].x+a[i].l);
        cout<<a[i].x<<" "<<a[i].y<<" "<<a[i].l<<endl;
        cout<<b[i].k1<<" "<<b[i].k2<<endl;
    }
    ans=n;
    for (int i=1;i<=n;i++){
        int now1=1<<10,now2=1<<10;
        for (int j=i-1;j>=1;j--){
            if (b[i].k1<b[j].k1) now1=0;
            if (b[i].k2>b[j].k2) now2=0;
        }
        if (!(now1+now2)) ans--;
    }
    cout<<ans<<endl;
    return 0;
}
 
   
  
 

猜你喜欢

转载自www.cnblogs.com/kanchuang/p/11503735.html