请自行脑补一张欧稳欧学车的图ios
欧稳欧学车时常常用一辆橡树车练习。这辆橡树车共有 \(N\) 个挡位,欧稳欧每秒能够把挡位增长或减小 \(1\),初始时(\(0\) 时刻)挡位为 $ 1$。spa
这辆车的转速范围是 \([L,R]\),初始时转速为 $ L$。每次升挡时,转速会变成 \(L\);降挡时,会变成 \(R\)。欧稳欧在每秒也能够踩油门,让转速增长 \(X\),再对 \(R\) 取 \(\text{min}\)。若是转速连续 \(K\) 秒都 \(=R\),那么这辆车的发动机会中止工做,在这 \(K\) 秒结束的一瞬间停下(即便 \(K\) 秒中经历了降档操做,仍然算这种状况)。code
这些操做咱们认为都是在每秒开头的一瞬间进行的,其中换挡操做比踩油门操做先进行。而这一秒内这辆车前进的距离是 转速\(\times\)挡位。get
如今给出欧稳欧练习时的操做序列,你须要求出他一共前进的距离是多少。io
第一行六个整数 \(T,N,L,R,X,K\),\(T\) 表示总时间。ast
接下来 \(T\) 行,每行两个整数 \(x,y\),表示这一秒的操做。class
其中 \(x=0\) 表示升挡,\(x=1\) 表示降挡,\(x=2\) 表示挡位不变;\(y=0\) 表示不踩油门,\(y=1\) 表示踩油门。(不要问为何没有刹车)stream
一行一个整数,表示给定操做序列的前进距离。变量
若是欧稳欧在挡位为 \(N\) 时升挡,或在挡位为 \(1\) 时降挡,那么给定序列不合法,输出 \(-1\)。im
输入 #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\le T,N,L,R,X,K\le 10^6,L\le R\)。
模拟
其实很简单的我想复杂了
因此看了好久的题目,担忧写出锅
主要缘由仍是由于这道题是gyh大佬给我推荐的
大佬推荐的固然简单不了啦
不过没想到gyh这么体贴我这个蒟蒻
找适合我这个水平的题目来给我作
开心qwq
(为何不开long long 只有10分,这不对)
关于档位有三个操做,关于速度有两个操做
升档,降档,不动和加速,不加速
根据给出的数据来模拟就行了
根据提议来模拟就行了
先判断是升档,降档仍是不动
若是是升档那就让档位增长,速度变为l
若是是降档那就让档位减小,速度变为r
若是是不动那就是不用管了
在判断是加速仍是不加速
加速那就用如今速度加上x以后和r取min
不加速就不用管
还有会不会抛锚这也是一个问题
只须要开一个变量储存已经在r速度上面持续了多久
若是这个时候速度是r那就变量++
否则就要变为0
#include<iostream> #include<cstdio> #define int long long using namespace std; int read() { int sum = 0,fg = 1; char c = getchar(); while(c < '0' || c > '9') { if(c == '-')fg = -1; c = getchar(); } while(c >= '0' && c <= '9') { sum = sum * 10 + c - '0'; c = getchar(); } return sum * fg; } signed main() { int ans = 0; int t = read(),n = read(),l = read(),r = read(),x = read(),k = read(); int dang = 1,zhuan = l; int last = 0; for(register int i = 1;i <= t;++ i) { int opt = read(),y = read(); if(opt == 0)//升档 { if(dang == n) { cout << -1 << endl; return 0; } dang ++; zhuan = l;//先升档 //若是不踩油门,那就只处理升档,若是踩油门那就加速 if(y == 1) zhuan = min(r,zhuan + x); } else if(opt == 1)//降档 { if(dang == 1) { cout << -1 << endl; return 0; } dang --; zhuan = r; if(y == 1) zhuan = min(r,zhuan + x); } else//档位不变 { if(y == 1) zhuan = min(r,zhuan + x); } ans += zhuan * dang; if(zhuan == r) last ++; else last = 0; if(last == k) break; } cout << ans << endl; return 0; } /* 6 3 1 10 5 100 0 1 0 0 2 1 2 1 1 1 1 0 */