cf 1050 div4 C题题解具体分析
题目
Farmer John 正在运行 FitnessGram 起搏器测试!农夫约翰花了一分钟跑到体育馆的另一边。因此,在每一分钟开始时,FJ可以选择要么跑到健身房的另一边,要么留在原地。如果他选择跑到健身房的另一边,他会获得一分。
FJ 将运行 Pacer 测试,直到开始m-第分钟。最初(在0-th minute),FJ 位于健身房的起始侧,我们将其表示为侧0.健身房的另一侧表示侧面1.
起搏器测试音频播放n次。在第ai minute,FJ 必须位于bi一侧。
FJ 在确保满足音频要求的同时可以获得的最大积分是多少?
输入
第一行包含整数t (1≤≤104) — 测试用例的数量。
每个测试用例的第一行包含两个整数n和m (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;
}
更多推荐

所有评论(0)