Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
这题很水思路:1、计算每段路上狗能够在规定条件下访问到的兴趣点,存储之; 2、对可访问的兴趣点少的路段优先访问,然后把取到的兴趣点从其他路段中剔除 为什么这么做,道理很简单,因为选择少所以优先取喽,虽然感觉不太对,但是AC了,附代码。 #include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> struct point{ int x, y; }; point master[101]; int n; point interesting_place[101]; int m; point result[202]; int visited[202]; struct node{ int number; int seq[101]; int count; }; node acc[101]; bool cmp(const node a, const node b) { return a.count > b.count; } int main() { float distance_dog, distance_master; int count = 0; scanf("%d%d", &n, &m); for (int i = 0; i < n; ++i) { scanf("%d%d", &(master[i].x), &(master[i].y)); } for (int i = 0; i < m; ++i) { scanf("%d%d", &(interesting_place[i].x), &(interesting_place[i].y)); } for (int i = 0; i < n - 1; ++i) { distance_master = (master[i].x - master[i + 1].x) * (master[i].x - master[i + 1].x) + (master[i].y - master[i + 1].y) * (master[i].y - master[i + 1].y); distance_master = sqrt(distance_master); acc[i].count = 0; acc[i].number = i; for (int j = 0; j < m; ++j) { distance_dog = sqrt((master[i].x - interesting_place[j].x) * (master[i].x - interesting_place[j].x) + (master[i].y - interesting_place[j].y) * (master[i].y - interesting_place[j].y)) + sqrt((master[i + 1].x - interesting_place[j].x) * (master[i + 1].x - interesting_place[j].x) + (master[i + 1].y - interesting_place[j].y) * (master[i + 1].y - interesting_place[j].y)); if (distance_dog / distance_master <= 2) { acc[i].seq[acc[i].count] = j; ++acc[i].count; } } } for (int i = 0; i < n - 1;) { std::sort(acc, acc + n - 1 - i, cmp); int pos = n - 2 - i; while (acc[pos].count == 0 && pos >= 0) { result[acc[pos].number * 2] = master[acc[pos].number]; visited[acc[pos].number * 2] = 1; count++; --pos; i++; } if (pos == -1) { break; } //i--; if (acc[pos].count) { int number = acc[pos].seq[acc[pos].count - 1]; result[acc[pos].number * 2] = master[acc[pos].number]; visited[acc[pos].number * 2] = 1; count++; result[acc[pos].number * 2 + 1] = interesting_place[number]; visited[acc[pos].number * 2 + 1] = 1; acc[pos].count = 0; count++; --pos; i++; for (int j = 0; j <= pos; ++j) { for (int k = 0; k < acc[j].count; ++k) { if (acc[j].seq[k] == number) { acc[j].seq[k] = acc[j].seq[acc[j].count - 1]; acc[j].count--; break; } } } } } result[(n - 1) * 2] = master[n - 1]; count++; visited[(n - 1) * 2] = 1; std::cout << count << std::endl; for (int i = 0; i <= (n - 1) * 2; ++i) { if (visited[i]) { printf("%d %d ", result[i].x, result[i].y); } } std::cout << std::endl; return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator