codeforces B. Eight Point Sets 解题报告
题目链接:http://codeforces.com/problemset/problem/334/B
一开始看到题目,有点怯,理解了题目后,其实并不难。这句话是突破口 three distinct integer vertical straight lines and three distinct integer horizontal straight lines(三个不同的整数所组成的垂直直线和三个不同的整数所组成的水平直线)。
首先要保证三个x是不同的(x1 != x2 != x3),三个y当然也是。x1包括三个相同的点(x11 = x12 = x13),x2包括两个相同的点(x21 = x22),x3包括三个相同的点(x31 = x32 = x33);y1的三个点则保证不同(y11 != y12 != y13),y2的两个点保证不同(y21 != y22),y3的三个点不同(y31 != y32 != y33)。然后要保证y11 = y21 = y31,y12 = y32,y13 = y22,y13 = y22 = y33,注意,不是y12 = y22 = y32,这是很容易错的)。另外,排序函数的cmp的运用起到了预处理的作用。
1 #include <iostream> 2 #include <algorithm> 3 #include <stdio.h> 4 #include <stdlib.h> 5 using namespace std; 6 7 struct set 8 { 9 int x, y; 10 }p[10]; 11 12 int cmp(set a, set b) 13 { 14 if (a.x != b.x) // x不同时(组外)按x(组外)升序排序 15 return a.x < b.x; 16 return a.y < b.y; // x相同时(组内)按y(组内)升序排序 17 } 18 19 int main() 20 { 21 int i; 22 for (i = 0; i < 8; i++) 23 scanf("%d%d", &p[i].x, &p[i].y); 24 sort(p, p+8, cmp); 25 if (p[0].x == p[2].x && p[3].x == p[4].x && p[5].x == p[7].x && 26 p[0].x != p[3].x && p[3].x != p[5].x && 27 p[0].y == p[3].y && p[0].y == p[5].y && p[1].y == p[6].y && 28 p[2].y == p[4].y && p[2].y == p[7].y && p[0].y != p[1].y && 29 p[1].y != p[2].y) 30 printf("respectable\n"); 31 else 32 printf("ugly\n"); 33 return 0; 34 }