• poj2060 Taxi Cab Scheme


      有m个订单,然后每个订单都有出发时间,起点,终点,然后问你完成这m个订单至少需要多少个出租车,可以这样想,m个订单,最多是m辆出租车,然后假如有一辆出租车第一个订单完成后,到达第二个订单的起点位置的时间<=第二个订单的出发时间-1,那么需要的出租车的数量就-1.由此可以知道需要的最少出租车数量就是m-最大匹配数。然后建图的时候注意一下就行了

      最小路径覆盖=顶点数-最大匹配

      很奇怪加了 std::ios::sync_with_stdio(false); 这句就过不了

    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #include<stdlib.h>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    int line[505][505],used[505],nxt[505];
    int m;
    struct node
    {
        int ne;
        int sx,sy,ex,ey;
        int t;
    }ta[505];
    bool cmp(const struct node&a,const struct node&b)
    {
        return a.t<b.t;
    
    }
    int icount(int x1,int y1,int x2,int y2)
    {
        return abs(x1-x2)+abs(y1-y2);
    }
    bool ifind(int x)
    {
        for(int i=1;i<=m;i++)
        {
            if(line[x][i]&&!used[i])
            {
                used[i]=1;
                if(nxt[i]==0||ifind(nxt[i]))
                {
                    nxt[i]=x;
                    return true;
                }
            }
        }
        return false;
    }
    int match()
    {
        int ans=0;
        for(int i=1;i<=m;i++)
        {
            memset(used,0,sizeof(used));
            if(ifind(i))
                ans++;
        }
        return ans;
    }
    int main()
    {
        
        int t;
        cin>>t;
        //cout<<"输入的t为:"<<t<<endl;
        while(t--)
        {
    
            memset(line,0,sizeof(line));
            memset(nxt,0,sizeof(nxt));
            cin>>m;
            for(int i=1;i<=m;i++)
            {
                int a,b,c,d,e,f;
                scanf("%d:%d%d%d%d%d",&a,&b,&c,&d,&e,&f);
                ta[i].ne=abs(c-e)+abs(d-f);
                ta[i].sx=c;
                ta[i].sy=d;
                ta[i].ex=e;
                ta[i].ey=f;
                ta[i].t=a*60+b;
            }
            sort(ta+1,ta+m+1,cmp);
            /*
            cout<<"输入的任务为"<<endl;
            for(int i=1;i<=m;i++)
                cout<<ta[i].ne<<" "<<ta[i].sx<<" "<<ta[i].sy<<" "<<ta[i].ex<<" "<<ta[i].ey<<" "<<ta[i].t<<endl;
            cout<<"************8"<<endl;
            */
            for(int i=1;i<=m;i++)
                for(int j=i+1;j<=m;j++)
                {
                    if((ta[i].t+ta[i].ne+icount(ta[i].ex,ta[i].ey,ta[j].sx,ta[j].sy))<=(ta[j].t-1))
                        line[i][j]=1;
    
                }
            cout<<m-match()<<endl;
    
    
        }
        return 0;
    
    }
    
  • 相关阅读:
    每日一题_191118
    每日一题_191117
    每日一题_191116
    每日一题_191115
    每日一题_191114
    每日一题_191113
    每日一题_191112
    每日一题_191111
    每日一题_191110
    一道抛物线自编题的思考
  • 原文地址:https://www.cnblogs.com/eason9906/p/11755045.html
Copyright © 2020-2023  润新知