其实理清了逻辑,这是很简单的一个小题,可是我由于长期没作这类题,对这类题的感受降低,致使没有抓住重点,因此没作出来,即使看了答案解析,也是过了快半个小时才明白过来的。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