Photo by Angela Huang from Pexels
emmmmm一道不知道怎么归类的题目,大概应该归类为思维题?
题目大意是说给出一场球赛中两个队伍几个时间点的比分情况,要你根据这几个比分情况来计算整个比赛过程中最多可能有多少次平局。
大致分析一下样例即可得到思路:对于一支队伍,依次取两个相邻时间点上的得分,将这两个得分分别看作是一个区间的左端点和右端点,那么对于两个相邻的时间点,我们就可以得到两个区间(分别属于两支队伍),然后求一下两个区间的交集的长度,答案即为所有符合要求的交集的长度。要注意的是,需要设一个rightest变量来表示当前当前已经计算到的“最右端的数”,从而避免重复计算。
代码如下:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <list>
#include <set>
#include <map>
#include <cctype>
#include <string>
#include <queue>
#define mst(a,b) memset((a),(b),sizeof(a))
#define debug printf("debug\n")
#define INF 0x3f3f3f3f
const int maxn=1e4+5;
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int a[maxn],b[maxn];
int vis[maxn];
int main()
{
int n;
cin>>n;
int a1,b1;
cin>>a1>>b1;
n--;
int pos=0;
if(!(a==0&&b==0)){
a[0]=b[0]=0;
a[1]=a1;b[1]=b1;
pos=2;
}else{
a[0]=b[0]=0;
pos=1;
}
for(int i=0;i<n;i++,pos++)
cin>>a[pos]>>b[pos];
ll ans=0;
int rightest=-1;
for(int i=1;i<=n+1;i++){
int lef1=a[i-1];
int lef2=b[i-1];
int rig1=a[i];
int rig2=b[i];
int lef=max(lef1,lef2);
int rig=min(rig1,rig2);
while(lef<=rightest)
lef++;
if(rig-lef>=0){
rightest=rig;
ans+=rig-lef+1;
}
}
cout<<ans<<endl;
return 0;
}