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

其實理清了邏輯,這是很簡單的一個小題,可是我由於長期沒作這類題,對這類題的感受降低,致使沒有抓住重點,因此沒作出來,即使看了答案解析,也是過了快半個小時才明白過來的。ios

有兩個球隊相互比賽,有他們比賽的n組數據,要求可否在已給定比賽數據的約束下,求出兩隊比賽成績相等的最屢次數。例如,數據以下。c++

2
1 2
3 4

則從0,0到1,2,可能平局有0,0、1,一、2,二、3,3.則答案爲4.後端

顯然,若是相鄰數據格式爲spa

a b
c d

則兩隊之間的可能的平局數至關於數軸上一條線段的長度:l=min(c,d)-max(a,b)+1.可是,我糾結於這條線段在端點處到底取不取,最後也沒有統一標準,反而腦子被搞得一團糟。其實,只須要統一一下,或者相等時的後端點不取,或者相等時的前段點不取,最後判斷一下第一個端點(這裏0,0確定相等,因此能夠設初始ans=1),或者最後一個端點,就好了。code

下面上代碼。ci

末端點單獨算的代碼it

#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,後面每次都減去線段左端點。io

#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 第二題,叫賣菜仍是買菜來着,反正是第二題。class

相關文章
相關標籤/搜索