Problem E: E.疫情控制
Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 6 Solved: 4
[ Submit][ Status][ Web Board]
Description
据某省水产部门通报,A市大面积范围水产养殖区爆发ADH氏菌疫情,导致大量鱼苗死亡,养殖户经济损失巨大。必须尽快控制疫情,使水产养殖秩序回归正常。
此次ADH氏菌疫情传染范围较大,涉及到 M 个地区。要想对某个地区I疫情进行控制,必须先控制住上游地区I-1的疫情,再对该地区监测,管理,施药才能彻底清除传染性,真正做到水体改良,水质改善。
不妨设M 个地区的编号1,2,…,M,首先,地区1的疫情得到控制后,才能在1天后控制地区2。类推,仅当地区i的疫情得到控制后,1天后才能去控制地区i+1;当第M个地区疫情被控制后,才算彻底控制住A市疫情。
如何做到早发现,早报告,早隔离,早治理,按照属地化管理原则,A市准备建立 N 个防疫中心。当一个防疫中心启用后,它可以对方圆半径 R 范围内的地区疫情加以控制,并且持续控制5天。N 个防疫中心也不是同时启动,当一个防疫中心启用5天后,才能启动另一个防疫中心。
启用一个防疫中心需要大量的人力,物力。请你设计一个方案,如何启用尽可能少的防疫中心就能够对A市所有疫情加以控制。
【约束条件】
1≤K≤5 1 ≤M, N ≤ 100,1≤ R≤1000, 0≤所有坐标X,Y≤10000
所有数据都是整数。 数据之间有一个空格。
Input
第一行: K 表示有多少组测试数据。
接下来对每组测试数据:
第1行: M N R
第2~M+1行: X1i Y1i 表示第 i 地区所在的坐标 i=1,…,M
第M+2~M+N+1行: X2 j Y2j 表示第 j 防疫中心的坐标 j=1,…,N
Output
对于每组测试数据,输出占一行:最少启用的防疫中心数量
Sample Input
4 3 6
0 6
6 6
6 0
0 0
0 3
1 1
1 5
Sample Output
HINT
启用3号防疫中心可以控制地区1,2
#include<iostream> #include<vector> #include<cmath> using namespace std; typedef struct { int x; int y; int Con[101];//被控制的城市的 代号 int length; //记录存放的 防疫中心 可以控制城市的 个数 }Coord; //用结构体存城市和防疫中心的坐标 int M, N, R, MMK= 101; int Correct[100] = { 0 }; //地区改善情况的数组 Coord area[100], project[100]; //地区数组 防疫中心数组 void FindMinDevice(int k, int sum) { for (int j = 0; j < project[k].length; j++) if (Correct[project[k].Con[j]] == 0) Correct[project[k].Con[j]] = k + 1; //此循环表示该城市已净化 int flag = 0; for (int q = 0; q < M; q++) { if (Correct[q] == 0) { flag = 1; break; } } if (flag == 0 && sum <MMK) //如果所有城市都改善成功,就退出递归 { MMK= sum; return; } for (int i = k + 1; i < N; i++) FindMinDevice(i, sum + 1); //不用考虑该防疫中心之前的,防止重复 for (int p = 0; p < M;p++) if (Correct[p] == k+1) Correct[p] = 0; //回溯城市的疫情,不影响其他递归的调用 } void contrue(int j) { for (int i = 0; i < M; i++) { if (sqrt(pow((area[i].x - project[j].x), 2) + pow((area[i].y - project[j].y), 2)) <= R) { project[j].Con[project[j].length] = i; //找出能被该防疫中心控制的城市 project[j].length++; } } } int main() { int K; cin >> K; while (K--) { MMK= 101; cin >> M >> N >> R; for (int i = 0; i < M; i++) cin >> area[i].x >> area[i].y; for (int j = 0; j < N; j++) { cin >> project[j].x >> project[j].y; project[j].length = 0; contrue(j); } for (int k = 0; k < N; k++) FindMinDevice(k, 1); cout << MMK<< endl; } return 0; }