题目大意:

输入n,m,k,分别代表城市的数量,城市编号1~n,航班的数量以及会议必须所有人员到会一起商议的天数,然后及时输入m行航班的信息,每一行输入d,f,t,c分别表示航班到站和始发的那一天(始发和到站是一天),f表示始发站,t表示目的地,c表示花费,然后f和t里必然有一个是0,表示要么是去0号城市,要么回到原来城市,题目要求就是,每个城市必须派人到0号城市参加会议,然后他们必须一块在0号城市k天,然后必须全部回到他们原来的城市才行(某个城市某个人到达0号城市之后可以愿意待多少天就待多少天,当然,回不去就尴尬了),让你求最小的花费,如果不能满足条件,输出-1;

基本思路:

最小费用分为0号城市的航班的费用和从0号城市飞回的费用,分别处理,然后贪心的话,就有一个问题,拿飞向0号城市的航班来说,到底是按照始发时间排序还是按照费用排序,想一下,如果按照费用排序,这个时间复杂度肯定过不了,那么就按照始发时间排序,这样,用一个dp数组记录总费用,下标是这n个航班的最晚始发时间,然后对于某一个最晚始发时间,最优的肯定是它和始发时间在它前面的最小费用了,然后就有这个dp【i】=min(dp【i-1】,dp【i】),这个点之前的最小费用就这样传递了过来,然后这样时间复杂度就是n,完全没问题;

反思与总结:

我只知道是贪心,并没有明确的贪心思路,看了题解才发现,类似的题目我也做过2个,真心菜,一定要扎实,首要目的是下次能a出这个题目啊;

代码如下:

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
const ll inf = 1e17;
const int maxn = 2000000+10;
const int maxx = 100000+10; struct Node
{
int d,f,t,c;
bool operator<(const Node& a)const {return d<a.d;}
}node[maxx];
ll dp1[maxn],dp2[maxn],b[maxn]; int main()
{
int n,m,k;
while(scanf("%d%d%d",&n,&m,&k)==3)
{
for(int i=0;i<=maxn;i++) dp1[i]=inf,b[i]=-1;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d%d",&node[i].d,&node[i].f,&node[i].t,&node[i].c);
}
sort(node+1,node+m+1);
int cnt=0;
ll sum=0;
for(int i=1;i<=m;i++)
{
if(node[i].f==0) continue;
if(b[node[i].f]==-1)
{
b[node[i].f]=node[i].c;
sum+=node[i].c;
cnt++;
}
else
{
if(b[node[i].f]>node[i].c)
{
sum-=b[node[i].f];
sum+=node[i].c;
b[node[i].f]=node[i].c;
}
}
if(cnt==n) dp1[node[i].d]=sum;
}
sum=0;
cnt=0;
for(int i=0;i<=maxn;i++) dp2[i]=inf,b[i]=-1;
for(int i=m;i>=1;i--)
{
if(node[i].t==0) continue;
if(b[node[i].t]==-1)
{
b[node[i].t]=node[i].c;
sum+=node[i].c;
cnt++;
}
else
{
if(b[node[i].t]>node[i].c)
{
sum-=b[node[i].t];
sum+=node[i].c;
b[node[i].t]=node[i].c;
}
}
if(cnt==n) dp2[node[i].d]=sum;
}
int sign;
for(int i=1;i<=maxn;i++) if(dp1[i]!=inf) {sign=i;break;}
for(int i=sign;i<=1000000;i++) dp1[i]=min(dp1[i],dp1[i-1]);
for(int i=1000000;i>=1;i--) if(dp2[i]!=inf) {sign=i;break;}
for(int i=sign-1;i>=1;i--) dp2[i]=min(dp2[i],dp2[i+1]);
ll res=inf;
for(int i=1;i<=1000000;i++)
{
if(dp1[i]==inf||dp2[i+k+1]==inf) continue;
res=min(res,dp1[i]+dp2[i+k+1]);
}
if(res==inf) printf("-1\n");
else printf("%I64d\n",res);
}
return 0;
}

codeforces round 433 D. Jury Meeting的更多相关文章

  1. Codeforces Round #433 (Div. 2)【A、B、C、D题】

    题目链接:Codeforces Round #433 (Div. 2) codeforces 854 A. Fraction[水] 题意:已知分子与分母的和,求分子小于分母的 最大的最简分数. #in ...

  2. Codeforces Round #433 (Div. 2, based on Olympiad of Metropolises) D. Jury Meeting(双指针模拟)

    D. Jury Meeting time limit per test 1 second memory limit per test 512 megabytes input standard inpu ...

  3. codeforces 853b//Jury Meeting// Codeforces Round #433 (Div. 1)

    题意:几个人要去一个城市k天,现给出各航班的日期和花费,让这n个人能相会k天的最小花费? 用数组arr1[i]记录在第i天人到齐的最小花费.arr2[i]记录第i天之后才有人开始走的最小花费.然后取a ...

  4. 【Codeforces Round #433 (Div. 1) B】Jury Meeting

    [链接]h在这里写链接 [题意] 有n个人,它们都要在某一时刻开始,全都到达0位置,然后维持最少k个时间单位,然后再全都回到原来的位置; 第i个人初始的位置是i. 且一共有m班航班. 每一班航班,要么 ...

  5. Codeforces Round #433 (Div. 2, based on Olympiad of Metropolises) D

    Country of Metropolia is holding Olympiad of Metrpolises soon. It mean that all jury members of the ...

  6. Codeforces Round #433 (Div. 2, based on Olympiad of Metropolises)

    A. Fraction 题目链接:http://codeforces.com/contest/854/problem/A 题目意思:给出一个数n,求两个数a+b=n,且a/b不可约分,如果存在多组满足 ...

  7. Codeforces Round#433 简要题解

    来自FallDream的博客,未经允许,请勿转载,谢谢. 我的号自从几个月前姿势水平过低疯狂掉分之后就没动过了  突然想上点分  就打了一场Div1  没想到打到了rank5  一发上橙了,可还行. ...

  8. [Codeforces Round #433][Codeforces 853C/854E. Boredom]

    题目链接:853C - Boredom/854E - Boredom 题目大意:在\(n\times n\)的方格中,每一行,每一列都恰有一个被标记的方格,称一个矩形为漂亮的当且仅当这个矩形有两个角是 ...

  9. Codeforces Round #433 Div. 1

    A:显然从大到小排序后贪心放在第一个能放的位置即可.并查集维护. #include<iostream> #include<cstdio> #include<cmath&g ...

随机推荐

  1. 转载 Struts2之------Action类中的get,set方法和execute方法的使用规范和使用流程(规范是没有理由的,必须遵守!!!)

    1,Action中get,set方法的使用流程? 前台form中有一个<input type="text" name="username"/> 如果 ...

  2. Electron-vue实战(一)—搭建项目与安装Element UI

    Electron-vue实战—搭建项目与安装Element UI 作者:狐狸家的鱼 本文链接 GitHub:sueRimn 一.新建项目1.初始化项目打开cmd,新建一个项目,我使用的是electro ...

  3. 2.第一个Codefirst实例

    1.什么是codefirst EF4.1中开始支持Code First .这种方式在领域设计模式中非常有用.使用Code First模式,你可以专注于领域设计,根据需要,为你一个领域的对象创建类集合, ...

  4. 【leetcode】835. Image Overlap

    题目如下: 解题思路:抛开移动的过程只看移动完成的结果,记图片左上角为顶点,正方形边长为board,要使得两个图片要有重叠,那么一定其中一张图片的顶点和另外一张图片的某一个点重合.假设图片A的顶点A( ...

  5. Vue学习笔记【27】——Vue路由(设置路由)

    设置路由高亮 css:     .router-link-active, /* vue-router*/    .myactive {      color: red;      font-weigh ...

  6. mac 格式化U盘

    作者:Bailm链接:https://www.zhihu.com/question/27888608/answer/486347894来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...

  7. bzoj 3881 [Coci2015]Divljak——LCT维护parent树链并

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3881 对 S 建 SAM ,每个 T 会让 S 的 parent 树的链并答案+1:在 T ...

  8. undefined null测试

    测试浏览器:chrome 当有父元素的子元素未定义时undefined和null均为true,类型为undefined 当元素赋给null后undefined和null均为true,类型为object ...

  9. 【缓存与性能优化】方法论:如何优化一个Web系统的性能

    1.性能简介 一个网络请求的等待: 减少等待时间方式 不同位置对性能的操控 开发人员优化性能的方式 性能指标 2.缓存 缓存是把一些需要计算或者访问数据库的数据,放到内存中,当客户端访问时,直接从内存 ...

  10. C++ placement new与内存池

    参考:https://blog.csdn.net/Kiritow/article/details/51314612 有些时候我们需要能够长时间运行的程序(例如监听程序,服务器程序)对于这些7*24运行 ...