KOŠARKA

· · 题解

解析

这道题可以用一个简单的模拟来做。

我们用 x_{i} 表示全场第 i 次得分的队伍,a_{i} 表示第 i 次输入时间的分数,b_{i} 表示第 i 次输入时间的秒数。

#include<bits/stdc++.h>
using namespace std;
int n,m = 1,i,x[105],a[105],b[105],ad,bd,s,t,st;
int main(){
    cin >> n;
    for(i = 1; i <= n; i++){
        scanf("%d %d:%d",&x[i],&a[i],&b[i]);
    }

紧接着,我们可以直接用 for 循环,直接模拟每一秒发生的事(是否在这一秒有得分记录)。

注意,i 不能从 1 开始,因为有两个数据点会让一个队伍在 00:00 得分!

for(i = 0; i <= 2880; i++){
        if(ad < bd){
            t++;
        }else if(ad > bd){
            s++;
        }
        if(i == a[m] * 60 + b[m]){
            (x[m] == 1? ad++ : bd++);
            m++;
        }
    }

最后,就可以直接输出了。

AC code

#include<bits/stdc++.h>
using namespace std;
int n,m = 1,i,x[105],a[105],b[105],ad,bd,s,t,st;
int main(){
    cin >> n;
    for(i = 1; i <= n; i++){
        scanf("%d %d:%d",&x[i],&a[i],&b[i]);
    }
    for(i = 0; i <= 2880; i++){//模拟 48 分钟内的得分情况。 
        if(ad < bd){
            t++;
        }else if(ad > bd){
            s++;
        }//如果一队比另一队领先,领先队的领先时间 + 1秒。 
        if(i == a[m] * 60 + b[m]){
            (x[m] == 1? ad++ : bd++);
            m++;
        }//如果有新的得分情况,就根据得分队伍来加分。 
    }
    printf("%02d:%02d\n%02d:%02d",s / 60,s % 60,t / 60,t % 60);
    //"%02d" 可以在输出的整数位数不足 2 位的时候,将不足的位用 0 补齐。 
    return 0;
}