大意:一个数轴上有n点,然后m行,为m个船的行驶距离和耗费。问能不能经过所有的点。
思路:判断大于等于当前的两岛间的距离,的最小的距离就是最优的。
#include <iostream>
#include <bits/stdc++.h>
#define LL long long
using namespace std;
LL arr[1000010],dis[1000010];
struct node{
LL d,w;
}q[1000000];
bool cmp(node a,node b){
return a.d > b.d;
}
int main(){
LL n,m,i,j,k,cla;
while(~scanf("%lld",&cla)){
while(cla--){
scanf("%lld%lld",&n,&m);
for(i = 0;i < n;++ i){
scanf("%lld",&arr[i]);
}
for(i = 0;i < n-1;++ i){
dis[i] = arr[i+1]-arr[i];
}
sort(dis,dis+n-1);
for(i = 0;i < m;++ i){
scanf("%lld%lld",&q[i].d,&q[i].w);
}
sort(q,q+m,cmp);
if(dis[n-2] > q[0].d){
puts("Impossible");continue;
}
LL ans=0,mi =1e15;
bool vis = false,flag = true;
int l = 0;
for(i = n-2;i >=0;i--){
while(l < m&&q[l].d>=dis[i]){
mi = min(mi,q[l++].w);
}
ans += mi;
}
printf("%lld\n",ans);
}
}
return 0;
}