luogu P5661【公交换乘】

时间:2019-12-14
本文章向大家介绍luogu P5661【公交换乘】,主要包括luogu P5661【公交换乘】使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

CSP2019 , PJt2

**做法:暴力加剪枝**

- 按照时间快排一遍,保证时间单调,以便后面剪枝

- 循环扫一遍,然后分类讨论:

1.当前是地铁,答案直接加上地铁的钱。

2.当前是公交,可以从后往前扫,找到编号最小(时间最早)的地铁优惠票,然后剪枝是如果当前时间已经过了优惠的时间,就直接break。如果找到符合条件的,标记一下,否则没有符合条件的,把答案加上公交的钱

$Code:$

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
inline int read(){
	register int x=0,v=1,ch=getchar();
	while(!isdigit(ch)){if(ch=='-')v=-1;ch=getchar();}
	while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^'0');ch=getchar();}
	return x*v;
}
const int MAX=100005,N=105;
struct GZ{int opt,p,t;}s[MAX];
inline bool cmp(GZ x,GZ y){return x.t<y.t;}
int n,Ans,ce,vis[MAX];
int main(){
	n=read();
	for(register int i=1;i<=n;++i){
		s[i].opt=read(),s[i].p=read(),s[i].t=read();
	}
	sort(s+1,s+1+n,cmp);
	for(register int i=1;i<=n;++i){
		if(s[i].opt==0){//subway
			Ans+=s[i].p;	
		}else{//bus
			ce=-1;
			for(register int j=i;j;--j){
				if(s[j].t<s[i].t-45){
					break;
				}
				if(s[i].p<=s[j].p&&!vis[j]&&s[j].opt==0){
					ce=j;
				}
			}
			if(ce==-1){
				Ans+=s[i].p;
			}else vis[ce]=1;
		}
	}
	printf("%d\n",Ans);
	return 0;
}

  

  

原文地址:https://www.cnblogs.com/Lates/p/12040492.html