题目链接:Jury Meeting
题目大意:有0到n这样n+1个城市,有m个航班,给出出发的时间(当天出发,当天到),出发的城市,到达的城市(要么是从0到某城市,要么是从某城市到0),后面是花费,然后除了0之外的所有城市都有1个科学家,现在所有家要一起在0呆k天,然后回到自己所在的城市,问最小花费
题目思路:贪心去做,我们先去找出发的最小花费,再找到达的最小花费,两个相加,预处理一下前缀和就好了(代码是扒的一个最短的代码)
#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 1e5+10,M = 1e6+10;
int n,m,k;
ll cost[N],a[M],b[M];
struct node{
int d,f,t,c;
}s[N];
bool cmp(node a,node b){
return a.d < b.d;
}
int main(){
while(~scanf("%d%d%d",&n,&m,&k)){
for(int i = 1;i <= m;i++)
scanf("%d%d%d%d",&s[i].d,&s[i].f,&s[i].t,&s[i].c);
sort(s+1,s+m+1,cmp);
for(int i = 1;i <= n;i++) cost[i] = 1e12;
ll now = 0;
int cc = 1;
for(int i = 1;i <= n;i++) now += cost[i];
for(int i = 1;i <= 1000000;i++){
while(cc <= m&&s[cc].d == i){
if(s[cc].t == 0&&s[cc].c < cost[s[cc].f]){
now += s[cc].c-cost[s[cc].f];
cost[s[cc].f] = s[cc].c;
}
cc++;
}
a[i] = now;
}
for(int i = 1;i <= n;i++) cost[i] = 1e12;
now = 0,cc = m;
for(int i = 1;i <= n;i++) now += cost[i];
for(int i = 1000000;i >= 1;i--){
while(cc >= 1&&s[cc].d == i){
if(s[cc].f == 0&&s[cc].c < cost[s[cc].t]){
now += s[cc].c-cost[s[cc].t];
cost[s[cc].t] = s[cc].c;
}
cc--;
}
b[i] = now;
}
ll ans = 1e18;
for(int i = 1;i <= 1000000-k-1;i++)
ans = min(ans,a[i]+b[i+k+1]);
if(ans < 1e12) printf("%I64d\n",ans);
else puts("-1");
}
return 0;
}