CSP2019T2 P5661 公交换乘 洛谷

2019普及组T2题解

洛谷P5661


题目描述

著名旅游城市 B 市为了鼓励大家采用公共交通方式出行,推出了一种地铁换乘公交车的优惠方案:

在搭乘一次地铁后可以获得一张优惠票,有效期为 45 分钟,在有效期内可以消耗这张优
惠票,免费搭乘一次票价不超过地铁票价的公交车。在有效期内指开始乘公交车的时间与开始乘地铁的时间之差小于等于 45 分钟,搭乘地铁获得的优惠票可以累积,即可以连续搭乘若干次地铁后再连续使用优惠票搭乘公交车。

搭乘公交车时,如果可以使用优惠票一定会使用优惠票;如果有多张优惠票满足条件,则优先消耗获得最早的优惠票。
现在你得到了小轩最近的公共交通出行记录,你能帮他算算他的花费吗?


输入格式

输入文件的第一行包含一个正整数 nn,代表乘车记录的数量。

接下来的 nn 行,每行包含 3 个整数,相邻两数之间以一个空格分隔。第 ii 行的第 1 个整数代表第 ii 条记录乘坐的交通工具,0 代表地铁,1 代表公交车;第 2 个整数代表第 ii 条记录乘车的票价,第三个整数代表第 i 条记录开始乘车的时间
(距 0 时刻的分钟数)。

我们保证出行记录是按照开始乘车的时间顺序给出的,且不会有两次乘车记录出现在同一分钟。


输出格式

输出文件有一行,包含一个正整数,代表小轩出行的总花费。


首先,这是个特别简单的题~~~~(学过数组的都能拿满分QwQ~)

按照这个题目的思路,代码大概是这样的:

#include
using namespace std;
struct N{
	int s,d,t;
	bool a=0;
}a[100005];
int ans=0;
int main(){
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i].d>>a[i].s>>a[i].t;
	}
	
	for(int i=0;i<n;i++){
		if(a[i].d==0)ans+=a[i].s;
		else{
			int f=0;
			for(int j=0;j<i;j++){
				if(a[j].d==0&&a[i].t-a[j].t<=45&&a[j].s>=a[i].s&&a[j].a==0){
					f=1;
					a[j].a=1;
					break;
				}
				if(a[i].t-a[j].t>45)break; 
			}
			if(f==0){
				ans+=a[i].s;
			}
		}
	}
	cout<<ans;
	return 0;
}

但是测试了只有40,其他的是TLE,因为有一个条件需要极其注意!

就是这个:

我们保证出行记录是按照开始乘车的时间顺序给出的,且不会有两次乘车记录出现在同一分钟。

因为乘坐的时间至少为1,所以只需要求 i-45 到 i-1 就行了,当然如果 i<45 就求 0 到 i-1 就可以了 ^ w ^

18行要改成这样:

for(int j=max(i,45)-45;j<i;j++){

完整代码^ w ^:

#include
using namespace std;

struct N{
	int v,s,t;
	bool f=0;
}a[100005];

int ans=0;

int main(){
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i].v>>a[i].s>>a[i].t;
	}
	
	for(int i=0;i<n;i++){
		if(a[i].v==0){
			ans+=a[i].s; 
		}else{
			int f=0;
			for(int j=max(i,45)-45;j<i;j++){
				if(a[j].f==0 && a[i].t-a[j].t<=45 && a[j].s>=a[i].s && a[j].v==0){
					a[j].f=1;
					f=1;
					break;
				}
			}
			if(f==0){
				ans+=a[i].s;
			}
		}
	}
	
	cout<<ans<<endl;
}

你可能感兴趣的:(CSP2019T2 P5661 公交换乘 洛谷)