题意:
给你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;
}