接下去的n行是陷阱的坐标,每行有4个正整数,它们从左到右分别是:陷阱左下角顶点的横坐标的值、陷阱左下角顶点的纵坐标的值,陷阱右上角顶点的横坐标的值、陷阱右上角顶点的纵坐标的值。
2008 HZNU Programming Contest
题目大意:给你M个同学丢的沙包位置,和N个矩形的对角坐标,对于每个同学,如果沙包在
某个矩形内,则该同学跑步距离为该矩形的周长,如果没有在任何一个矩形内,则该同学跑步
距离为0米,对所有同学跑步距离从大到小排序并输出。
思路:将M个同学丢沙包位置存在结构体数组P[]中,N个矩形坐标位置存在结构体数组A[]中,
然后计算所有矩形的周长,两重循环判断第i个同学丢的沙包在哪个矩形中,保存周长到P[i],
最后sort按距离从大到小排序并输出。
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; struct Node { int x; int y; int l; }P[20010]; struct Node1 { int x1,y1; int x2,y2; int l; }A[110]; bool cmp(Node a,Node b) { return a.l > b.l; } int main() { int N,M; while(cin >> M >> N) { memset(A,0,sizeof(A)); memset(P,0,sizeof(P)); for(int i = 0; i < M; ++i) cin >> P[i].x >> P[i].y; for(int i = 0; i < N; ++i) { cin >> A[i].x1 >> A[i].y1 >> A[i].x2 >> A[i].y2; A[i].l = 2*(A[i].y2-A[i].y1) + 2*(A[i].x2-A[i].x1); } for(int i = 0; i < M; ++i) { for(int j = 0; j < N; ++j) { if(P[i].x>=A[j].x1 && P[i].x <= A[j].x2 && P[i].y>=A[j].y1 && P[i].y<=A[j].y2) { P[i].l = A[j].l; break; } } } sort(P,P+M,cmp); for(int i = 0; i < M; ++i) cout << P[i].l << endl; } return 0; }