1 条题解

  • 0
    @ 2025-8-24 22:31:44

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar ImposterAnYu
    I love barbara forever! | q3572195459 wx rzbxs3288,要电话请私信

    搬运于2025-08-24 22:31:44,当前版本为作者最后更新于2021-08-26 10:08:25,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    解析

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

    我们用 xix_{i} 表示全场第 ii 次得分的队伍,aia_{i} 表示第 ii 次输入时间的分数,bib_{i} 表示第 ii 次输入时间的秒数。

    #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 循环,直接模拟每一秒发生的事(是否在这一秒有得分记录)。

    注意,ii 不能从 11 开始,因为有两个数据点会让一个队伍在 00:0000: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;
    }
    
    • 1

    信息

    ID
    6840
    时间
    1000ms
    内存
    32MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者