Description
For the sake of simplicity, we model a city as a rectangular grid. An address in the city is denoted by two integers: the street and avenue number. The time needed to get from the address a, b to c, d by taxi is |a - c| + |b - d| minutes. A cab may carry out a booked ride if it is its first ride of the day, or if it can get to the source address of the new ride from its latest,at least one minute before the new ride's scheduled departure. Note that some rides may end after midnight.
Input
Output
Sample Input
2 2 08:00 10 11 9 16 08:07 9 16 10 11 2 08:00 10 11 9 16 08:06 9 16 10 11
Sample Output
1 2
题意:给出乘客的起始时间,起点和目的地的坐标,求最少要几辆的士能满足所有的乘客的出行。
#include<cstdio>
#include<cstring>
using namespace std;
#define MAX 505
#define abs(x) ((x)>0?(x):(-(x)))
//这里的括号一定不能省
int time[MAX],pos[MAX][4];
bool path[MAX][MAX],visit[MAX];
int match[MAX];
bool SearchPath(int s,int m)
{
for(int i=0; i<m; ++i)
{
if(path[s][i]&&!visit[i])
{
visit[i]=true;
if(match[i]==-1||SearchPath(match[i],m))
{
match[i]=s;
return true;
}
}
}
return false;
}
int distants(int a,int b,int c,int d)
{
return (abs(a-c)+abs(b-d));
}
int main()
{
int T,n,a,b;
scanf("%d",&T);
for(;T--;)
{
scanf("%d",&n);
memset(path,false,sizeof(path));
for(int i=0;i<n;++i)
{
scanf("%d:%d",&a,&b);
time[i]=a*60+b;
for(int j=0;j<4;++j)
scanf("%d",&pos[i][j]);
}
for(int i=0;i<n;++i)
{
for(int j=i+1;j<n;++j)
{
if(time[i]+distants(pos[i][0],pos[i][1],pos[i][2],pos[i][3])+distants(pos[i][2],pos[i][3],pos[j][0],pos[j][1])<time[j])
path[i][j]=true;
}
}
int summ=0;
memset(match,-1,sizeof(match));
for(int i=0; i<n; ++i)
{
memset(visit,false,sizeof(visit));
if(SearchPath(i,n))
summ++;
}
printf("%d\n",n-summ);
}
return 0;
}
来源: http://blog.youkuaiyun.com/acm_ted/article/details/7780079
1377



被折叠的 条评论
为什么被折叠?



