sdut 2168 Mathmen 贪心

来源:互联网 发布:千牛卖家第三方软件 编辑:程序博客网 时间:2024/06/05 05:08

题意:

给你n个点代表n个不同的城市,m种交通工具,每种交通工具有不同的消耗和行驶距离。从一个城市到另一个城市只能用一个交通工具

问从1到n是否存在最优的走法,即消耗最小

分析:

1到n就是有n-1段路,对于每段路肯定是选取满足行驶距离大于该段路中的交通工具中消耗最小的那个

用优先队列搞搞就ok

ACcode:

#include <bits/stdc++.h>#define ll long long#define maxn 100005using namespace std;struct N{    int dis;    int q;    void init(){scanf("%d%d",&dis,&q);}    bool operator <(const N &tmp)const{        return q>tmp.q;    }}my[maxn];bool cmp(N a,N b){    if(a.dis==b.dis)return a.q<b.q;    return a.dis>b.dis;}int dis[maxn];int main(){    int loop,n,m;    scanf("%d",&loop);    while(loop--){        scanf("%d%d",&n,&m);        for(int i=0;i<n;++i)scanf("%d",&dis[i]);        for(int i=0;i<n-1;++i)dis[i]=dis[i+1]-dis[i];        for(int i=0;i<m;++i)my[i].init();        sort(dis,dis+n-1);        sort(my,my+m,cmp);        if(dis[n-2]>my[0].dis)puts("Impossible");        else{            ll ans=0;            priority_queue<N>q;            int k=0;            for(int i=n-2;i>=0;--i){                while(dis[i]<=my[k].dis&&k<m)                    q.push(my[k++]);                ans+=q.top().q;            }            cout<<ans<<'\12';        }    }    return 0;}


0 0
原创粉丝点击