居然可以这么写-2021年哈理工新生赛KIKI看球赛

困扰了我一个下午也没有100%用例AC的一道题

示例一:
输入:
3
2 0
3 1
3 4
输出:
2

说明:
样例中比赛过程可能是这样的:
0:0, 1:0, 2:0, 2:1, 3:1, 3:2, 3:3, 3:4
共经历了0:0和3:3两次平分。

思路:只要上一个的最大值与计时器取max小于当前的最小值与而且就有当前最小值减去上一次最大值与计时器的max加一的重叠不清楚比分的区间,要是要平局最大当然就是把重叠的全看成平局,最后计时器等于当前最小值加一

#include
using namespace std;
#define rep(i,l,r)  for(int i=(l);i<=(r);i++)
#define per(i,r,l)  for(int i=(r);i>=(l);i--)
typedef long long ll;
const int N = 1e4+10;
typedef pair pii;
const int mod = 1e9+7;
ll fpow(ll a,ll b){a%=mod;ll res =1;while(b){if(b&1)res=res*a%mod;a=a*a%mod;b>>=1;}return res;}
pii s[N];
int main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int n;
    cin >> n;
    s[0] = {0,0};//初始化
    int ans = 0,score = 0;//ans为最终答案,score表示当前的"最低平分门槛"
    rep(i,1,n)//从1到n开始遍历
    {//如果去思考的话,会发现我们需要在上一局的最大值与这一局的最小值中找关系。
        cin >> s[i].first >> s[i].second;//输入
        int mi = max(s[i-1].first,s[i-1].second);//上一局的最大值
        int ma = min(s[i].first,s[i].second);//这一局的最小值
        mi = max(mi,score);//最低的平分标准还需要与score再来求一次最大值
        if(ma>=mi)  
        {
            ans += ma-mi+1;
            score = ma + 1;//刷新平分数(下一局需要到达的最低平分的分数)
        }
    }
    cout << ans << endl;
    return 0;
}

kiki看球赛

题目描述
kiki看了一场非常激烈的球赛,他在比赛过程中分几次记录了当前两队的分数。
意犹未尽的kiki取出了自己记录的比分,想根据自己记录的不同时刻的比分推断
一下最多有多少次两队比分是持平的(包括0:0)。kiki希望你能帮助他计算这个结果。

输入描述:
第一行一个整数n(1<=n<=10^4),表示kyoka记录的次数。
之后输入n行,第i+i行输入以空格分开的两个整数ai,bi(1<=ai,bi<=10^9)
代表第i次记录时两队的比分(按时间顺序)

输出描述:
在第一行中输出一个整数k,代表最多有k次两队的比分是持平的。

但是居然还有更绝的 

#include
using namespace std;

int t,a,b,m=0,n=0,ans;

int main(){
  cin>>t;
  while(t--){
    cin>>a>>b;
    if(n==m)ans+=min(a,b)-n;
    else ans+=(min(a,b)-max(n,m)<0)?0:(min(a,b)-max(n,m)+1);
    n=a;m=b;
  }cout<

我:......

你可能感兴趣的:(笔记本,c++,算法,开发语言)