题目背景
请自行脑补一张欧稳欧学车的图
题目描述
欧稳欧学车时经常用一辆橡树车练习。这辆橡树车共有 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;
}