题目描述
给定平面上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; }