codeforces round 433 D. Jury Meeting
题目大意:
输入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的更多相关文章
- Codeforces Round #433 (Div. 2)【A、B、C、D题】
题目链接:Codeforces Round #433 (Div. 2) codeforces 854 A. Fraction[水] 题意:已知分子与分母的和,求分子小于分母的 最大的最简分数. #in ...
- 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 ...
- codeforces 853b//Jury Meeting// Codeforces Round #433 (Div. 1)
题意:几个人要去一个城市k天,现给出各航班的日期和花费,让这n个人能相会k天的最小花费? 用数组arr1[i]记录在第i天人到齐的最小花费.arr2[i]记录第i天之后才有人开始走的最小花费.然后取a ...
- 【Codeforces Round #433 (Div. 1) B】Jury Meeting
[链接]h在这里写链接 [题意] 有n个人,它们都要在某一时刻开始,全都到达0位置,然后维持最少k个时间单位,然后再全都回到原来的位置; 第i个人初始的位置是i. 且一共有m班航班. 每一班航班,要么 ...
- 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 ...
- 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不可约分,如果存在多组满足 ...
- Codeforces Round#433 简要题解
来自FallDream的博客,未经允许,请勿转载,谢谢. 我的号自从几个月前姿势水平过低疯狂掉分之后就没动过了 突然想上点分 就打了一场Div1 没想到打到了rank5 一发上橙了,可还行. ...
- [Codeforces Round #433][Codeforces 853C/854E. Boredom]
题目链接:853C - Boredom/854E - Boredom 题目大意:在\(n\times n\)的方格中,每一行,每一列都恰有一个被标记的方格,称一个矩形为漂亮的当且仅当这个矩形有两个角是 ...
- Codeforces Round #433 Div. 1
A:显然从大到小排序后贪心放在第一个能放的位置即可.并查集维护. #include<iostream> #include<cstdio> #include<cmath&g ...
随机推荐
- 前端学习(三十一)canvas(笔记)
canvas 画布 画图.做动画.做游戏=========================================== canvas就是新标签 必须获取绘图 ...
- @PathVariable、@RequestParam、@RequestBody注解
讲解更加详细的参考资料 https://blog.csdn.net/u011410529/article/details/66974974 https://www.cnblogs.com/soul-w ...
- get和post 两种基本请求方式的区别
GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...
- js 原生 document.querySelectorAll document.getElementsByTagName document.querySelector document.getElementById的区别
1.querySelector只返回匹配的第一个元素,如果没有匹配项,返回null. 2.querySelectorAll返回匹配的元素集合,如果没有匹配项,返回空的nodelist(节点数组). ...
- LR之-参数化
1.改变参数化主要在于select next now和update value on这个二个选项 sequential:顺序取值 random:随机取值 unique:唯一取值 same line a ...
- [NOIP模拟25]题解
A.字符串 Catalan数不能再裸了 #include<cstdio> #include<iostream> #include<cstring> using na ...
- Django实现得步骤流程
我们利用django实现功能得时候,步骤和流程是怎样得呢? 一,首先要在Models中创建表. 1,在setting中找到DATABASE 中找到要使用得数据库,用mysql就把名字改了mysql. ...
- TIOBE 编程语言排行榜是什么,它是如何计算编程语言排行的?
做为一名程序员,都比较关注其使用编程语言的热度,一方面编程语言的热度决定了它拥有多大的市场,另一方面也关系到行业内程序员选择机会有多大. 我们总听说某个编程语言排名第一,那么这些数据到底准不准确呢? ...
- 86、使用Tensorflow实现,LSTM的时间序列预测,预测正弦函数
''' Created on 2017年5月21日 @author: weizhen ''' # 以下程序为预测离散化之后的sin函数 import numpy as np import tensor ...
- spring MVC 返回值信息和ResponseBody的响应json数据
spring mvc的界面返回: 如果我们定义的返回类型是String 那么我们返回的时候直接写入 我们的界面的名字就可以了 springmvc会自动去找到我们的界面,如果是void类型的返回那么 ...