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 ...
随机推荐
- 五、properties编写
1.properties和yml编写对比 2.properties中文乱码解决 上面的内容输出的结果 原因 idea 默认编码是UTF-8,properties需要修改对应的编码 设置编码后的结果正常 ...
- 通过cmd命令启动appium server,appium server安装过程
电脑上已安装了appium desktop版,想在移动端自动化的过程中,通过脚本启动appium server,环境准备: 1.确保电脑安装了node.js,目前用的是node12 2.安装JDK,且 ...
- 常用Concurrent.util包工具类——高并发
一 Concurrent.util常用类: 1. CyclicBarrier: 假设有场景:每个线程代表一个跑步运动员,当运动员都准备好后,才一起出发只要有一个人没有准备好,大家都等待. import ...
- C++ 排序(未完)
参考: 快速排序 堆排序 各类排序 #include <iostream> #include <vector> #include <time.h> #include ...
- Halo(五)
ApplicationPreparedEvent 监听事件 Event published once the application context has been refreshed but be ...
- isinstance 的用法 判断这个数据是否属于这个类型
- 洛谷 P1271 聚会的快乐(树状dp)
题目描述 你要组织一个由你公司的人参加的聚会.你希望聚会非常愉快,尽可能多地找些有趣的热闹.但是劝你不要同时邀请某个人和他的上司,因为这可能带来争吵.给定N个人(姓名,他幽默的系数,以及他上司的名字) ...
- 76 学习C++
0 引言 C++语言特性记录,提高对这门语言的理解,进而带动对编程语言特性的理解. 相关网站及教程 # W3Cschool C++教程 https://www.w3cschool.cn/cpp/ # ...
- %各位大佬的博客.tql
线性基:https://www.cnblogs.com/ljh2000-jump/p/5869991.html#4219854 数位DP https://blog.csdn.net/jk211766 ...
- 【C#、阿里云、Tomcat、XP系统】c#下使用.NET4.0中HttpWebRequest访问Tomcat中HTTPS项目时,在XP系统中超时
情景: 1.使用Java开发的Web项目,部署在服务器Tomcat中 2.项目使用HTTPS,使用阿里云的PFX证书 阿里云推荐Tomcat配置如下 <Connector port=" ...