sdut 2168 Mathmen 贪心

题意:

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

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

分析:

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

用优先队列搞搞就ok

ACcode:

#include <bits/stdc++.h>
#define ll long long
#define maxn 100005
using 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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值