`
暴风雪
  • 浏览: 388790 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

[二分匹配]zoj 3156:Taxi

阅读更多

大致题意:
    有n个人和m辆车(n<=m)。给出所有人和车的坐标,以及人移动的速度。现在让每个人走去找一辆车坐。每辆车只能乘坐一个人,花费的时间最少是多少。

 

大致思路:
    二分这个时间的最大值tmax,再用匈牙利算法判定是否n个人都能在tmax的时间内赶到车上。

    一开始直接二分距离,高精度神马的写渣了。后来发现,二分枚举距离值的下标就可以~~

 

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int nMax=200;
const double eps=1e-9;
int n,m;
bool map[nMax][nMax];
bool vis[nMax];
int linkk[nMax];
int dfs(int s){
	for(int i=1;i<=m;i++){
			if(!vis[i]&&map[s][i]){
				vis[i]=1;
		        if(linkk[i]==-1||dfs(linkk[i])){
						linkk[i]=s;
			             return 1;
				}
			}
	}
	return 0;
}

double peo[nMax][2];
double tex[nMax][2];
double dis[nMax][nMax],vec;

double getdis(int a,int b)
{
    double tmp=(peo[a][0]-tex[b][0])*(peo[a][0]-tex[b][0])+(peo[a][1]-tex[b][1])*(peo[a][1]-tex[b][1]);
    double res=sqrt(tmp);
    return res;
}

double tim[200000];
int xxx;
double getinit()
{
    xxx=0;
    int i,j;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            dis[i][j]=getdis(i,j);
            dis[i][j]/=vec;
            tim[xxx++]=dis[i][j];
        }
    }
}

bool check(double mid)
{
    int i,j;
  //  memset(map,0,sizeof(map));
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            if(abs(dis[i][j]-mid)<eps||dis[i][j]<mid)
            {
                map[i][j]=1;
            }
            else
            {
                map[i][j]=0;
            }
        }
    }
    int res=0;
    memset(linkk,-1,sizeof(linkk));
    for(i=1;i<=n;i++){
        memset(vis,0,sizeof(vis));
        if(dfs(i))res++;
    }
    if(res==n)return 1;
    return 0;
}

int main()
{
    int i,j,v;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(i=1;i<=n;i++)
        {
          // cin>>peo[i][0]>>peo[i][1];
             scanf("%lf%lf",&peo[i][0],&peo[i][1]);
        }
        for(i=1;i<=m;i++)
        {
           // cin>>tex[i][0]>>tex[i][1];
            scanf("%lf%lf",&tex[i][0],&tex[i][1]);
        }
        cin>>vec;
        getinit();
        sort(tim,tim+xxx);
        int left=0,right=xxx-1,mid,ans=xxx-1;
        while(right>=left){
            mid=(right+left)/2;
            if(check(tim[mid])){
                right=mid-1;
                if(mid<ans)ans=mid;
            }
            else{
                left=mid+1;
            }
        }
        printf("%.2f\n",tim[ans]);
    }
    return 0;
}
 
0
0
分享到:
评论

相关推荐

    ZOJ:浙江大学程序在线评测系统.docx

    ZOJ,全称“浙江大学程序在线评测系统”(Zhejiang University Online Judge),是一个提供信息学(算法竞赛)题库及程序评测的网站。以下是关于ZOJ的详细介绍: 一、基本信息 名称:浙江大学程序在线评测系统(ZOJ)...

    ACM训练必备POJ ZOJ题目分类及解题思路

    学习ACM程序设计的朋友一定要看,这是训练必备的POJ ZOJ题目分类及解题思路

    浙江大学ZOJ题目分类

    浙江大学ZOJ(Zhejiang University Online Judge)是一个在线编程练习平台,主要服务于计算机科学和技术的学习者,特别是对算法和编程有浓厚兴趣的学生。这个平台提供了大量的编程题目,涵盖了各种难度和主题,帮助...

    zoj 源码700题

    3. **算法与数据结构**:700题涵盖的范围广泛,涉及基本的排序算法(如冒泡、快速、归并排序),查找算法(如二分查找),以及高级算法如动态规划(如斐波那契数列、背包问题)、图论(如最短路径、最小生成树)、...

    zoj 1002_zoj1002_

    【标题】"ZOJ 1002" 是一个在线编程竞赛题目,源自ZOJ(Zhejiang Online Judge),这是一个面向ACM/ICPC(国际大学生程序设计竞赛)的在线评测系统。题目编号1002,通常表示该题是ZOJ平台上的一个问题,可能涉及算法...

    pku hdu zoj题目分类

    "POJ 计算几何入门题目.doc"可能介绍了计算几何的基础知识,并提供了一些实践题目,这个领域涉及点、线、面的相互关系,以及在二维和三维空间中的几何操作。 5. **ZOJ题目分类**: "zoj题目分类.doc"对应浙江大学...

    zoj 分类加题解(浙大ACM)

    《ZOJ ACM分类加题解》是针对浙江大学ACM竞赛训练平台的一份宝贵资源,它包含了大量的编程竞赛题目和相应的解答。这份资料旨在帮助参赛者提升算法能力,提高解决实际问题的技巧,无论是在无网络环境下还是有网络时,...

    ZOJ题解集合-截至2835

    1. **基础算法**:包括排序(如快速排序、归并排序)、搜索(如二分查找)、动态规划、贪心算法、回溯算法等。 2. **高级数据结构**:如链表、树(二叉树、平衡树如AVL和红黑树)、图(深度优先搜索、广度优先搜索...

    zoj1027解题指南

    【标题】"ZOJ1027解题指南"是一个针对特定编程竞赛题目——ZOJ1027的解决方案集合。ZOJ,全称为“Zhejiang Online Judge”,是浙江大学主办的一个在线编程竞赛平台,提供了丰富的算法题目供参赛者练习和挑战。本解题...

    zoj 700源代码

    3. **字符串处理**:ZOJ题目中往往包含许多字符串处理问题,如模式匹配、字符串比较、最长公共子序列等。源代码会展示如何高效地操作字符串。 4. **数学知识**:部分题目可能需要运用到高等数学知识,如组合数学、...

    ZOJ题目答案源码

    首先,我们可以从这些源代码中学习到基础的算法思想,如排序算法(快速排序、归并排序、冒泡排序、插入排序等)、搜索算法(二分查找、深度优先搜索、广度优先搜索等)。这些算法是解决问题的基本工具,理解和掌握...

    zoj代码集合

    1. **基础算法**:作为入门部分,这个集合可能包括基础数据结构和算法,如排序(快速排序、归并排序、堆排序)、查找(二分查找、哈希表查找)以及图论的基本概念(Dijkstra、Floyd等)。这些是所有ACM竞赛者必须...

    zoj 题库 详细解答 解题代码

    zoj 题库 详细解答 解题代码 该资源主要涵盖了 zoj 题库中的各种编程题目,涵盖了基本算法、数据结构、数学运算等多个方面的知识点。下面是对该资源中出现的知识点的详细解释: 1. 第一次 ACM 总结(7th ACM) 该...

    acm.tar.gz_zoj_zoj题解_题目分类

    9. 排序和搜索:快速排序、归并排序、二分查找等,这些都是算法中的基本操作。 难易度的划分则可能基于题目所需的时间复杂度、空间复杂度、解题思路的复杂性等因素。初级题目通常是基础概念和算法的运用,适合初学...

    Problem Arrangement zoj 3777

    Problem Arrangement zoj 3777

    ZOJ月赛 题解 (ZOJ Monthly, August 2014)

    **ZOJ月赛题解 (ZOJ Monthly, August 2014)** ZOJ(Zhejiang Online Judge)是中国著名的在线编程竞赛平台之一,它为程序员和学生提供了丰富的算法练习和比赛机会。2014年8月的ZOJ月赛是一场面向广大编程爱好者的...

    zoj.rar_zoj_zoj4041

    《ZOJ 4041问题的正确解法与程序分析》 ZOJ(Zhejiang Online Judge)是一个知名的在线编程竞赛平台,其中的题目编号为4041的题目吸引了众多程序员的关注。本篇文章将深入探讨ZOJ 4041的正确解法,并对提供的源代码...

    zoj.zip_zoj

    【标题】"zoj.zip_zoj"所对应的资源是一个与ZOJ(Zhejiang Online Judge)相关的代码集合。ZOJ是浙江大学主办的一个在线编程竞赛平台,它提供了多种算法题目供用户练习和提交代码进行评测。这个压缩包很可能包含了在...

    zoj.gz_ ZOJ_ZOJ 1016_max flow_zoj 1045_zoj.rar

    标题中的"ZOJ.gz_ ZOJ_ZOJ 1016_max flow_zoj 1045_zoj.rar" 提到了两个ZOJ(Zhejiang Online Judge)的题目,分别是1016和1045,这两个数字通常代表在线编程竞赛中的题目编号。这些题目通常涉及到算法和数据结构的...

Global site tag (gtag.js) - Google Analytics