样例解析
拿第一个样例举例
这两段区间打游戏,求这段区间消耗的电量。
首先我们要知道[30,100]这段区间分为三个部分:
其中,这两端区间都是打游戏时的性能模式,这段区间又分为了几部分。
首先是游戏结束之后经过t1(5)分钟之后进入正常模式,在正常模式经过t2(8)分钟之后进行省电模式。这段区间总共的耗电量可以用下面这段来表示:
这段区间的总耗电量表示如下:
思想
根据上面的样例解释我们发现我们只需要处理两部分的耗电量:
1.所有打游戏区间的总耗电量
2.不打游戏区间的总耗电
最后把这两部分的耗电量累加起来就是答案
我们先处理打游戏区间的总耗电量:
首先我们先定义一个temp=-1,用来判断是否是第一段(开启游戏之后进入的性能模式)。
如果temp是-1的话那么我们就把第一段(性能模式)的贡献加到答案当中去,然后更新到下一个段游戏时间(temp=r)
#include<bits/stdc++.h>
using namespace std;
int a,m,n,k,t1,t2,result;
int l,r;
int main()
{
cin>>n>>m>>n>>k>>t1>>t2;
int temp=-1;
while(a--)
{
cin>>l>>r;
if(temp!=-1)
{
}
result+=(r-l)*m;
temp=r;
}
cout<<result<<endl;
return 0;
}
之后的处理逻辑:
我们向后遍历,看当前时间距离上一段游戏结束已经过去了多久,没有超过t1时间的仍然按照性能模式的耗电量m处理,超出t1时间没有超出t2时间的按照正常模式n的耗电量处理,超出t2时间的按照省电模式的耗电量k处理。
#include <bits/stdc++.h>
using namespace std;
int a, m, n, k, t1, t2;
int simple;
int result;
int main() {
cin >> a >> m >> n >> k >> t1 >> t2;
int temp = -1; //表示当前石否处于打游戏时的性能模式
while (a--) {
int l, r;
cin >> l >> r;
//如果游戏结束,那么就往后推t1分钟进入正常模式
//没有超出t1时间的部分仍按照 性能模式的m耗电量处理
if (temp != -1) {
simple = l - temp;
if (simple < t1)
result += simple * m;
//如果此时处于正常模式下还没有超过t2时间
//我们就吧没超过t1时间的按照性能模式m耗电量m处理
//超过t1但没过t2时间的按照正常模式n耗电量处理
else if (simple < t1 + t2) {
result += t1 * m + (simple - t1) * n;
}
//如果此时处于省电模式
//没超过t1时间的按照性能模式耗电量m处理
//超过t1但没过t2时间的按照正常模式n耗电量处理
//超过t2时间的按照省电模式k耗电量处理
else {
result += t1 * m + t2 * n + (simple - t1 - t2) * k;
}
}
//对每一段打游戏的耗电量(性能模式)进行累加
result += (r - l) * m;
temp = r; //更新下一段区间
}
cout << result << endl;
return 0;
}