Time Limit: 1000MS | Memory Limit: 10000K | |||
Total Submissions: 3272 | Accepted: 1313 | Special Judge |
Description算法
Inputui
Outputthis
Sample Inputspa
4 5 1 4 5 7 5 2 -2 4 -4 -2 3 9 1 2 -1 3 8 -3
Sample Outputrest
6 1 4 3 9 5 7 5 2 1 2 -2 4
Sourcecode
1 Source Code 2 Problem: 1034 3 Memory: 416K Time: 16MS 4 Language: GCC Result: Accepted 5 6 7 8 #include <stdio.h> 9 #include <math.h> 10 #include <string.h> 11 12 #define DOG_SPEED 2 13 14 #define MAX_POINT_NUM 101 15 16 #define TRUE (int)1 17 #define FALSE (int)0 18 19 typedef int BOOL; 20 21 typedef struct 22 { 23 int x; 24 int y; 25 }Point; 26 27 typedef struct 28 { 29 int num; 30 Point pos[MAX_POINT_NUM]; 31 }Points; 32 33 Points g_Bob; 34 Points g_interests; 35 BOOL g_isOccupied[MAX_POINT_NUM]; 36 int g_len[MAX_POINT_NUM][MAX_POINT_NUM]; 37 int g_selectNum; 38 int g_selectIdx[MAX_POINT_NUM]; 39 int g_BobToInterest[MAX_POINT_NUM]; 40 41 void Input() 42 { 43 int i; 44 45 scanf("%d %d", &g_Bob.num, &g_interests.num); 46 47 for(i = 0; i < g_Bob.num; i++) 48 { 49 scanf("%d %d", &g_Bob.pos[i].x, &g_Bob.pos[i].y); 50 } 51 52 for(i = 0; i < g_interests.num; i++) 53 { 54 scanf("%d %d", &g_interests.pos[i].x, &g_interests.pos[i].y); 55 } 56 57 g_selectNum = 0; 58 memset(g_len, -1, sizeof(g_len)); 59 memset(g_selectIdx, -1, sizeof(g_selectIdx)); 60 memset(g_BobToInterest, -1, sizeof(g_BobToInterest)); 61 } 62 63 void Output() 64 { 65 int bobIdx, interestIdx; 66 67 printf("%d\n", g_Bob.num+g_selectNum); 68 69 for(bobIdx = 0; bobIdx < g_Bob.num; bobIdx++) 70 { 71 printf("%d %d ", g_Bob.pos[bobIdx].x, g_Bob.pos[bobIdx].y); 72 interestIdx = g_BobToInterest[bobIdx]; 73 if(interestIdx != -1) printf("%d %d ", g_interests.pos[interestIdx].x, g_interests.pos[interestIdx].y); 74 } 75 } 76 77 static double CalcLen(Point* m, Point* n) 78 { 79 double x = m->x - n->x; 80 double y = m->y - n->y; 81 82 return sqrt(x*x+y*y); 83 } 84 85 int IsLenSatisfied(int bobIdx, int interestIdx) 86 { 87 double bobLen, dogLen1, dogLen2; 88 89 if(g_len[bobIdx][interestIdx] == -1) 90 { 91 bobLen = CalcLen(&g_Bob.pos[bobIdx], &g_Bob.pos[bobIdx+1]); 92 dogLen1 = CalcLen(&g_Bob.pos[bobIdx], &g_interests.pos[interestIdx]); 93 dogLen2 = CalcLen(&g_Bob.pos[bobIdx+1], &g_interests.pos[interestIdx]); 94 g_len[bobIdx][interestIdx] = ((bobLen*DOG_SPEED) >= (dogLen1+dogLen2)) ? 1 : 0; 95 } 96 return g_len[bobIdx][interestIdx]; 97 } 98 99 BOOL DogFinding(int bobIdx) 100 { 101 int interestIdx; 102 103 for(interestIdx = 0; interestIdx < g_interests.num; interestIdx++) 104 { 105 if(!g_isOccupied[interestIdx] && IsLenSatisfied(bobIdx, interestIdx)) 106 { 107 g_isOccupied[interestIdx] = TRUE; 108 if(g_selectIdx[interestIdx] == -1 || DogFinding(g_selectIdx[interestIdx])) 109 { 110 g_selectIdx[interestIdx] = bobIdx; 111 g_BobToInterest[bobIdx] = interestIdx; 112 return TRUE; 113 } 114 } 115 } 116 117 return FALSE; 118 } 119 120 void Proc() 121 { 122 int bobIdx; 123 for(bobIdx = 0; bobIdx < g_Bob.num-1; bobIdx++) 124 { 125 memset(g_isOccupied, 0, sizeof(g_isOccupied)); 126 if(DogFinding(bobIdx)) g_selectNum++; 127 } 128 } 129 130 int main() 131 { 132 Input(); 133 Proc(); 134 Output(); 135 return 0; 136 }