/*http://zju.acmclub.com/index.php?app=problem_title&id=1&problem_id=2355
2355:真人CS
时间限制:1 秒内存限制:32 兆特殊判题: 否 提交:106解决: 40
题目描述
小明和他的小伙伴们很喜欢玩真人CS,正好现在放暑假了,小明一行人便来到真人CS的场地开战了,交战双方是以小明为首的A队,和以小亮为首的B队。
正在A队侦查敌情的时候,他们被埋伏好的B队发现了!A队所在的区域有一些掩护物,如果某个队员在s秒内没能到达某个掩护物处,则这个队员有被击中的可能。
现在告诉你A队队员的个数、掩护物的个数以及每个队员和每个掩护物的位置坐标,并且每个队员的移动速度都相同且匀速。问你在采取最佳躲避策略的情况下,会有多少队员仍然可能会被击中。
注意:一个掩护物只能躲一个人。
输入格式
输入包含多组测试数据。
每组第一行输入4个正整数n,m,s,v(均小于100),n表示A队队员个数,m表示掩护物个数,s和v的含义如题目描述中所述。
接下来n行每行输入两个浮点数x1和y1,表示每个队员的位置坐标。
再接下来m行每行输入两个浮点数x2和y2,表示每个掩护物的位置坐标。
题目中距离单位为米,时间单位为秒,速度单位为米/秒。
输出
对于每组输入,输出在采取最佳躲避策略的情况下,会有多少队员仍然可能会被击中。
样例输入
2 2 5 10
1.0 1.0
2.0 2.0
100.0 100.0
20.0 20.0
样例输出
1
思路:二分匹配,刚开始没有看出来
开始的时候用的是贪心法,借助排序来计算,这个思路一开始就是错误的,因为考虑的时候一点也不周全
换成了用二分匹配法,但是但是一直wrong answer.结果是因为很低级的错误造成的,字的类型没有弄好的原因造成的
2013.7.15
内存 耗时 语言 代码长度 提交时间
1420 kb 32 ms 1404 B 2013-07-15 16:55:56
*/
#include<string.h> #include<stdio.h> #include<istream> #include<stdlib.h> #include<algorithm> #include<math.h> #include <iostream> using namespace std; const int maxn=105; int vis[maxn]; int map[maxn][maxn]; int result[maxn]; double X1[maxn],Y1[maxn]; double y2[maxn],x2[maxn]; int n,m; double length(double a1,double b1,double a2,double b2) { return sqrt((a1-a2)*(a1-a2)+(b1-b2)*(b1-b2)); } int find( int a)//利用KM求最大匹配数 { for(int i=1;i<=m;i++) { if(map[a][i]==1&&!vis[i]) { vis[i]=1; if(result[i]==0||find(result[i])) {result[i]=a; return 1; } } } return 0; } int main() { int i,j; int cnt; double s,v; while(scanf("%d%d",&n,&m)!=EOF) { scanf("%lf%lf",&s,&v); cnt=0; for(i=1;i<=n;i++) scanf("%lf%lf",&X1[i],&Y1[i]); for(j=1;j<=m;j++) scanf("%lf%lf",&x2[j],&y2[j]); //memset(vis,0,sizeof(vis)); memset(map,0,sizeof(map)); memset(result,0,sizeof(result)); for(i=1;i<=n;i++) for(j=1;j<=m;j++) { if(length(X1[i],Y1[i],x2[j],y2[j])<=s*v) map[i][j]=1; } for(i=1;i<=n;i++) {memset(vis,0,sizeof(vis)); if(find(i)) cnt++; } printf("%d\n",n-cnt); } return 0; }