Codeforces Round #541 (Div. 2) B. Draw!

其实理清了逻辑,这是很简单的一个小题,但是我因为长期没做这类题,对这类题的感觉下降,导致没有抓住重点,所以没做出来,即便看了答案解析,也是过了快半个小时才明白过来的。

有两个球队相互比赛,有他们比赛的n组数据,要求能否在已给定比赛数据的约束下,求出两队比赛成绩相等的最多次数。例如,数据如下。

2
1 2
3 4

则从0,0到1,2,可能平局有0,0、1,1、2,2、3,3.则答案为4.

显然,如果相邻数据格式为

a b
c d

则两队之间的可能的平局数相当于数轴上一条线段的长度:l=min(c,d)-max(a,b)+1.但是,我纠结于这条线段在端点处到底取不取,最后也没有统一标准,反而脑子被搞得一团糟。其实,只需要统一一下,或者相等时的后端点不取,或者相等时的前段点不取,最后判断一下第一个端点(这里0,0肯定相等,所以可以设初始ans=1),或者最后一个端点,就行了。

下面上代码。

末端点单独算的代码

#include <bits/stdc++.h>
using namespace std;

int main()  {
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n,a0=0,b0=0,ans=1,a,b;
    ans=0;
    cin>>n;
    for (int i=1;i<=n;i++)   {
        cin>>a>>b;
        ans+=max(0,min(a,b)-max(a0,b0)+1);
//        if (a0==b0) ans--;
        if (a==b)   ans--;        //减去右端点
        if (i==n&&a==b)   ans++;        //如果最后端点还相等,此时这个端点也需要算进去了,因为下次就退出循环了。
        a0=a,b0=b;
    }
    cout<<ans<<endl;
    return 0;
}

首端点单独算的代码,其实就是开头肯定为0,0,则初始ans=1,后面每次都减去线段左端点。

#include <bits/stdc++.h>
using namespace std;

int main()  {
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n,a0=0,b0=0,ans=1,a,b;
//    ans=0;
    cin>>n;
    for (int i=1;i<=n;i++)   {
        cin>>a>>b;
        ans+=max(0,min(a,b)-max(a0,b0)+1);
        if (a0==b0) ans--;             //减去左端点
//        if (a==b)   ans--;       
//        if (i==n&&a==b)   ans++;
        a0=a,b0=b;
    }
    cout<<ans<<endl;
    return 0;
}

这题告诉我们,区间问题,端点要统一取左或者取右,不能都顾上。

相关例题CSP CCF 2018-09 第二题,叫卖菜还是买菜来着,反正是第二题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值