洛谷3月月赛II T1 欧稳欧再次学车

欧稳欧正在使用一辆橡树车进行驾驶练习。车辆有N个挡位,初始挡位1,转速范围[L, R],初始转速L。每次换挡转速会变为L(升挡)或R(降挡),每秒可以踩油门增加转速X(不超过R)。若转速连续K秒等于R,发动机停机。任务是计算按给定操作序列前进的总距离。非法操作如挡位溢出则输出-1。样例展示不同情况下的行驶过程和结果。" 130855826,10448902,使用JavaScript实现点击复制到剪贴板功能,"['JavaScript', '前端', '开发语言']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目背景
请自行脑补一张欧稳欧学车的图

题目描述
欧稳欧学车时经常用一辆橡树车练习。这辆橡树车共有 N 个挡位,欧稳欧每秒可以把挡位增加或减少 1,初始时(0 时刻)挡位为 1。

这辆车的转速范围是 [L,R],初始时转速为 L。每次升挡时,转速会变成 L;降挡时,会变成 R。欧稳欧在每秒也可以踩油门,让转速增加 X,再对 R 取 min。如果转速连续 K 秒都 =R,那么这辆车的发动机会停止工作,在这 K 秒结束的一瞬间停下(即使 K 秒中经历了降档操作,仍然算这种情况)。

这些操作我们认为都是在每秒开头的一瞬间进行的,其中换挡操作比踩油门操作先进行。而这一秒内这辆车前进的距离是 转速×挡位。

现在给出欧稳欧练习时的操作序列,你需要求出他一共前进的距离是多少。

输入输出格式
输入格式:
第一行六个整数 T,N,L,R,X,K,T 表示总时间。

接下来 T 行,每行两个整数 x,y,表示这一秒的操作。

其中 x=0表示升挡,x=1表示降挡,x=2 表示挡位不变;y=0 表示不踩油门,y=1 表示踩油门。(不要问为什么没有刹车)

输出格式:
一行一个整数,表示给定操作序列的前进距离。

如果欧稳欧在挡位为 N 时升挡,或在挡位为 1 时降挡,那么给定序列不合法,输出 -1。

输入输出样例
输入样例#1:

5 3 1 10 5 100
0 1
0 0
2 1
2 1
1 1

输出样例#1:

83

输入样例#2:

3 1 1 1 1 2
2 0
2 1
2 0

输出样例#2:

2

输入样例#3:

1 2 3 4 5 6
1 0

输出样例#3:

-1

说明
对于样例一:

第一秒挡位为 2,转速为 6;
第二秒挡位为 3,转速为 1;
第三秒挡位为 3,转速为 6;
第四秒挡位为 3,转速为 10;
第五秒挡位为 2,转速为 10。

对于样例二,前进两秒之后发动机就停止了工作。

对于30% 的数据,没有挡位操作(即保证 x=2);

对于另外30% 的数据,没有踩油门操作(即保证 y=0);

对于全部数据,保证 1≤T,N,L,R,X,K≤106,L≤R。

分析:就按照题目模拟就好了.注意要开long long

#include<bits/stdc++.h>
using namespace std;
int main()
{
	long long t,n,l,r,x,k;
	scanf("%lld%lld%lld%lld%lld%lld",&t,&n,&l,&r,&x,&k);
	long long zs = l;//转速
	long long dang = 1;//档位
	long long ans = 0;//答案
	int k1 = k;
	while(t--)
	{
		
		int sjb;//升档,降档,不变
		int cbc;//踩油门还是不踩油门
		scanf("%d%d",&sjb,&cbc);
		if(sjb == 0)
		{
			if(cbc == 0)
			{
				zs = l;
				dang++;
				ans += zs * dang;
			}else{
				dang++;
				zs = l;
				zs += x;
				zs = min(zs,r);
				ans += zs * dang;
			}
		}else if(sjb == 1)
		{
			if(cbc == 0)
			{
				zs = r;
				dang--;
				ans += zs *dang;
			}else{
				dang--;
				zs = r;
				zs += x;
				zs = min(zs,r);
				ans += zs *dang; 
			}
		}else{
			if(cbc == 0)ans += zs * dang;
			else{
				zs += x;
				zs = min(zs,r);
				ans += zs * dang;
			}
		}
		if(zs != r)k1 = k;
		if(zs == r)k1--;
		if(k1 == 0)break;
		if(dang > n || dang < 1){printf("-1\n");return 0;}
	}
	printf("%lld",ans);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值