2023年码蹄杯二赛 手机测试 题型:模拟

9 阅读3分钟

码题集OJ-手机测试 (matiji.net)

样例解析

拿第一个样例举例

[30,40][60,100][30,40] [60,100]这两段区间打游戏,求[30,100][30,100]这段区间消耗的电量。

首先我们要知道[30,100]这段区间分为三个部分:

[30,40][30,40]

[40,60][40,60]

[60,100][60,100]

其中[30,40][30,40],[60,100][60,100]这两端区间都是打游戏时的性能模式,[40,60][40,60]这段区间又分为了几部分。

首先是游戏结束之后经过t1(5)分钟之后进入正常模式,在正常模式经过t2(8)分钟之后进行省电模式。这段区间总共的耗电量可以用下面这段来表示:

(5×4)+(8×5)+(7×6)=102(5×4)+(8×5)+(7×6)=102

[30,100][30,100]这段区间的总耗电量表示如下:

10×4+102+40×4=40+102+200=30210×4+ 102 + 40×4=40+102+200=302

思想

根据上面的样例解释我们发现我们只需要处理两部分的耗电量:

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;
}

image.png