首页 > 其他分享 >csp-j2023第四题 旅游巴士

csp-j2023第四题 旅游巴士

时间:2024-08-11 16:49:41浏览次数:9  
标签:node cur int graph 时间 巴士 time j2023 csp

旅游巴士这道题在一年之前的csp-j中并没有做(我是一个蒟蒻)
回看本题,又有了新的想法
对于每一层i我们将其看成走到这是的时间j mod k的余数
很显然,为了让我们更快的通过,等待时间+当前时间>=限制时间是最优的

/*
使用分层图,跑dijkstra堆优化的最短路
在限制时间那部分,若小于限制时间,可每次等k的倍数的时间,使得:等待时间+当前时间>=限制时间
因为离开时间是k的倍数,所以我们尽量使每次到达一个点的时间也是k的倍数,这样离开时就不用再等太久了
按照上述思路敲代码是最优的 
vector数组graph是用来存储分层图的,为graph_node类型的 
min_time[i]表示走到分层图的第i个节点的最优时间 
q 是优先队列(堆)priority_queue,是graph_node结构体为类型的,进行重载小于号,方便堆排序 
时间复杂度 O(nk log(nk)) 
*/
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+10;
struct graph_node{
	int to_node;
	int cur_time;
	bool operator<(const graph_node &s1)const{
		return cur_time>s1.cur_time;
	}
};
vector<graph_node>graph[N];
int n,m,k;
int min_time[N];
void dijkstra(int start){
	for (int i=1;i<=n*k;i++)min_time[i]=0x3f3f3f3f;
	priority_queue<graph_node>q;
	q.push({start,0});min_time[1]=0;
	while (!q.empty()){
		int cur=q.top().to_node,t=q.top().cur_time;q.pop();
		if (t<=min_time[cur]){
			for (const auto&road:graph[cur]){
				int plat=min_time[cur]+1,limt=road.cur_time;
				if (min_time[cur]<limt)plat+=ceil((limt-min_time[cur])*1.0/k)*k;
				if (plat<min_time[road.to_node]){
					min_time[road.to_node]=plat;
					q.push({road.to_node,plat});
				}
			}
		}
	}
}
int main(){
	cin>>n>>m>>k;
	int x,y,len;
	for (int i=1;i<=m;i++){
		cin>>x>>y>>len;
		for (int j=0;j<k;j++)
			graph[j*n+x].push_back({(j+1)%k*n+y,len});
	}
	dijkstra(1);
	if (min_time[n]==0x3f3f3f3f)cout<<-1;
	else cout<<min_time[n];
	return 0;
} 

标签:node,cur,int,graph,时间,巴士,time,j2023,csp
From: https://www.cnblogs.com/ZhangXuanRui/p/18353594

相关文章

  • CSP17
    请注意:题目背景与题目可能没有关系第一题,性质题,找到序列的最大值与最小值,我们发现如果只有正数的话和只有负数的话都很好处理,正数正序处理类似前缀加,负数后缀加,那如果正负都有,该怎么办呢?其实我们可以吧序列全变为正的或负的吧,但是需要比较一下最大值最小值,如果都变成正的话,对......
  • [赛记] 暑假集训CSP提高模拟17
    符号化方法初探100pts签到题?做了得有1.5h+;考虑全是正数或全是负数的情况,那么我们可以对其做一次类似于前缀和或后缀和的操作,需要$n-1$次;所以我们只需将数列中的数全部转化成正数或负数即可,具体地,找出所有正数的和和所有负数的和,如果前者比后者要大,那么就将所有正数加起......
  • [考试记录] 2024.8.10 csp-s 模拟赛18
    80+20+0+70=170第三题应该有10分暴力的,但我没打。T1星际旅行题面翻译总共有n个节点,m条路径,要求其中m-2条路径走两遍,剩下2条路径仅走一遍,问不同的路径总数有多少,如果仅走一遍的两条边不同则将这两条路径视为不同。样例#1样例输入#15412131415样例输......
  • 暑假集训CSP提高模拟17
    \[暑假集训CSP提高模拟\operatorname{EIJ}_{2}(6)-1\]\(\operatorname{EIJ}_{k}(A)\)定义为有\(A\)个球,\(k\)个盒子,盒子相同,球不同,把全部球放入的方案数Hint易知\(\operatorname{EIJ}_k(A)=\dfrac{A^k}{k!}\),详见这篇文章其实我觉得构造的过程更有意思:对一个给定的正......
  • 暑假集训csp提高模拟17
    赛时rank16,T1100,T250,T325,T425T4是简单题,但因为转移方程没有继承上一位状态,然后就挂了T3写了个神秘的状压,打了25的部分分T2暴力,T1正解T1符号化方法初探[ABC081D]Non-decreasing考虑最大值和最小值若\(abs(max)>abs(min)\),则将所有的负数加上最大值使其变为正,前缀......
  • 『模拟赛』暑假集训CSP提高模拟17
    RankA.符号化方法初探原[ABC081D]Non-decreasing挺水的,不过赛时想了错解。赛时做法是都塞到一个set里一遍推过去,如果比上一个小就lower_bound找一个最接近差的数加上,不过它存在比较大的问题。首先全是负判不了,会进入死循环;其次用map存下标也会出现存在两个相同的......
  • 暑假集训CSP提高模拟17
    暑假集训CSP提高模拟17组题人:@joke3579\(T1\)P222.符号化方法初探\(70pts\)原题:[ABC081D]Non-decreasing部分分测试点\(1\):输出样例\(1\)。测试点\(11\sim15\):由于\(\{a\}\)非负,所以对\(\{a\}\)作前缀和即可。随机\(pts\):乱搞。正解当......
  • P9750 [CSP-J 2023] 一元二次方程题目总结
    根据题面,我们将分为多种情况讨论:若a为负数,那么将a,b,c全部取反首先求出data=b^2-4*a*c;1,data<=0cout<<”NO”;否则带入求跟公式:-b/2a+(-)sqrt(data)注意::gcd(a,b)有可能为负数,此处应用abs(x)取绝对值若开根号data为有理数{-b为2*a的倍数则直接输出b否则输出b/gcd(b,2*a......
  • 什么是CSPO及成为CSPO的好处?
    组织在导入Scrum过程中,关于产品负责人,即PO通常会遇到类似于这样或那样的情况,例如有时整个项目在用Scrum但却无PO;有时项目中有PO但PO却没有充分被授权;有时PO又过分被动;还有时PO与SM是由项目中同一个人兼任……遇到这诸多问题,该如何解决呢?在这里我们不妨先明确一下PO这个角色的定义......
  • 暑假集训CSP提高模拟 16
    \[暑假集训CSP提高模拟\lim_{x\rightarrow\infty}\frac{8f_{x}}{f_{x+1}}\times(\sqrt{5}+1),\\forallf_{x}=f_{x-1}+f_{x-2}\]如果你实在不会算\(\forallf_{x}=f_{x-1}+f_{x-2}\)的情况,那你可以把它特化成斐波那契数列.如果你连斐波那契数列特化的上式都算不出来,那么你应......