题目链接:http://codeforces.com/problemset/problem/1131/B
思路:
每个状态和前一个状态相比,sta表示前一个状态的情况:(a,b是比分)
sta==0 : a=b
sta==1 : a>b
sta==-1 : a<b
根据不同的状况来划分qwq情况。
注意,当前一个状态比分不相等时,比如3:2,且本状态的a,b都有增加,比如5:6,那么前一个状态最多是从3:3开始平局,后一个状态最多能加到5:4,即min(nowa,nowb)-max(prea,preb)+1
若本状态是5:5则加了5-3+1=3,(3:3,4:4,5:5)
所以在往下一个状态sta=0(5:5)时,就不能再加上5:5了,加上min(nowa,nowb)-prea
比如变成6:7,就加上1(6:6)
扫描二维码关注公众号,回复:
5298512 查看本文章
比如变成6:6,还是加上1(6:6)
代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
#include<stack>
#include<cmath>
#include<set>
#include<map>
using namespace std;
#define ll long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
typedef pair<int,int>P;
const int INF=0x3f3f3f3f;
const int N=10005,mod=32767;
int a[N],b[N];
int sta;
void judge(int x,int y){
if(x==y)sta=0;
else if(x>y)sta=1;
else sta=-1;
}
int main(){
int n,ans;
a[0]=b[0]=0;
while(scanf("%d",&n)!=EOF){
sta=0;ans=0;
for(int i=1;i<=n;i++){
scanf("%d%d",&a[i],&b[i]);
if(sta==0){
if(a[i]>a[i-1]&&b[i]>b[i-1])ans+=min(a[i]-a[i-1],b[i]-b[i-1]);
}
if(sta==1){
if(a[i]==a[i-1]&&b[i]==b[i-1])ans+=0;
else if(a[i]>a[i-1]&&b[i]==b[i-1])ans+=0;
else if(a[i]>a[i-1]&&b[i]>b[i-1]){
int t=min(a[i],b[i]);
if(t-a[i-1]>=0)ans+=t-a[i-1]+1;
}
else if(a[i]==a[i-1]&&b[i]>b[i-1]&&b[i]>=a[i])ans++;
}
if(sta==-1){
if(a[i]==a[i-1]&&b[i]==b[i-1])ans+=0;
else if(a[i]>a[i-1]&&b[i]==b[i-1]&&a[i]>=b[i])ans++;
else if(a[i]>a[i-1]&&b[i]>b[i-1]){
int t=min(a[i],b[i]);
if(t-b[i-1]>=0)ans+=t-b[i-1]+1;
}
else if(a[i]==a[i-1]&&b[i]>b[i-1])ans+=0;
}
judge(a[i],b[i]);
}
ans++;
printf("%d\n",ans);
}
}