题目

Farmer John 正在运行 FitnessGram 起搏器测试!农夫约翰花了一分钟跑到体育馆的另一边。因此,在每一分钟开始时,FJ可以选择要么跑到健身房的另一边,要么留在原地。如果他选择跑到健身房的另一边,他会获得一分

FJ 将运行 Pacer 测试,直到开始m-第分钟。最初(在0-th minute),FJ 位于健身房的起始侧,我们将其表示为侧0.健身房的另一侧表示侧面1.

起搏器测试音频播放n次。在第ai minute,FJ 必须位于bi一侧

FJ 在确保满足音频要求的同时可以获得的最大积分是多少?

输入

第一行包含整数t (1≤≤104) — 测试用例的数量。

每个测试用例的第一行包含两个整数nm (1≤n≤2⋅105,n≤m≤109) — 要求数量和总分钟数。

以下内容n行包含两个整数一个我b我 (1≤一个我≤米,b我∈{0,1})— 这-th 要求。保证一个我>一个我−1总之一>1.

保证n在所有测试用例中不超过2⋅105.

3
2 4
2 1
4 0
2 7
1 1
4 0
4 9
1 0
2 0
6 1
9 0

输出

对于每个测试用例,输出 FJ 可以获取的最大点数。

2

7

6

问题分析

拿分原则:1min内跑向对面(改变位置)拿一分;在第 ai min必须在bi规定的位置处。

那我们假设一开始我们一直在往返跑,所以有所有分数(1min一分),求时间间隔即可;

没有要求前 一直是0 1 0 1 0 1……

那么当两次要求(这一次和上一次)的时间间隔是偶数时,在的位置一致;是奇数时,则相反;

减不减分就看你要求变没变,时间间隔的奇偶性;

间隔是偶数,地点没变:不减分
          奇数,        没变  减分
          偶数,        变了  减分
          奇数,        变了  不减分

具体实现

用循环输入n行的要求时间x和要求地点y;

只需要记住这一次和上一次的要求即可,所以用px保存上一次要求的时间,py保存上一次要求的地点;

x-px是时间间隔,y-py来看变没变地点

注意1:y-py可能会出现0-1=-1  负值的情况所以+2来避免

if(((x-px+2)%2)!=((y-py+2)%2)) 用if语句判断奇偶性是否一致;

不一致则减分;

注意2:我们所假设的拥有全部分数也是一段一段加起来的,从0min到第一次要求的时间a1,从a1到a2……

所以别忘了给出的m总分钟数,当最后一次要求时间比m小时,还可以接着跑,白嫖的分别忘了加

#include<bits/stdc++.h>
using namespace std;
void solve(){
	int n,m;
	cin>>n>>m;
	
	int x,y;
	int score=0;
	int px=0,py=0;
	while(n--)
	{
		cin>>x>>y;  
		score+=x-px;  //把所有的间隔相加,相当于拥有到最新的x的全部分数
		if(((x-px+2)%2)!=((y-py+2)%2)) score--;  //判断奇偶性,减去拿不到的分数
		px=x;
		py=y;
		
	}
	if(px!=m){
		score+=m-px;    //别忘了加上最后要求时间到最终截止时间可以白嫖的分数
	}
	cout<<score<<endl;
}
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		solve();
	}
	return 0;
}

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐