1 条题解

  • 0
    @ 2025-8-24 22:28:38

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Spectator
    我趁有半天空档 / 为你跑一趟 / 城市里永远有宝藏

    搬运于2025-08-24 22:28:38,当前版本为作者最后更新于2021-09-29 17:50:38,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    题目传送门


    Analysis{\color{SkyBlue}Analysis}

    我们需要得到两个问题的答案:

    1. 上半场总共得了多少分?(整场比赛持续 4×124 \times 12 分钟。)
    2. 发生多少次反超?(一次反超定义为一支队伍在得分小于对方后,经过投球使得得分超过对方。)

    Ideas{\color{SkyBlue}Ideas}

    (1)我们首先来解决第一个问题: 由于整场比赛持续 4×124 \times 12 分钟,所以上半场比赛共有 21260=1440(s)2*12*60=1440(s) 。那么只要 ti<=1440t_i<=1440 ,就要增加 ansans

    (2)我们接着解决第二个问题: 我们可以先计算每一个时刻的分数。如果有队伍在之前的分数是小于对方,现在的分数是大于对方,那么这就是反超!(其实真的很简单!!) 但是,我们需要注意这种情况:

    A队分数 B队分数
    3 4
    4
    5

    这是不算反超的!!(因为B队一直都是领先A队的。)


    Code{\color{SkyBlue}Code}

    #include<bits/stdc++.h>
    using namespace std;
    long long n,m,ans=0,anss=0,ld;//ld是记录当前谁领先(a=>1,b=>2)
    int a[3000],b[3000],jsa[3000],jsb[3000];
    int main()
    {
    	scanf("%lld",&n);
    	for(int i=1; i<=n; i++)
    	{
    		scanf("%d",&a[i]);
    		if(a[i]<=1440) ans++;//在上半场得分
    		jsa[a[i]]=1;
    	}
    	scanf("%lld",&m);
    	for(int i=1; i<=m; i++)
    	{
    		scanf("%d",&b[i]);
    		if(b[i]<=1440) ans++;//在上半场得分
    		jsb[b[i]]=1;
    	}
    	printf("%lld\n",ans);
    
    	for(int i=1; i<=3000; i++)
    		jsa[i]+=jsa[i-1],jsb[i]+=jsb[i-1];//记录每一个时刻的两队分数
    
    	for(int i=1; i<=3000; i++)
    	{
    		if(jsa[i]>jsb[i] && jsa[i-1]==jsb[i-1] && ld==2) //A队反超B队,且在之前是B队领先
    			anss++;
    		if(jsa[i]<jsb[i] && jsa[i-1]==jsb[i-1] && ld==1) //B队反超A队,且在之前是A队领先
    			anss++;
    		if(jsa[i]!=jsb[i]) //更新领先队伍
    		{
    			if(jsa[i]>jsb[i]) ld=1; //A队领先
    			else ld=2; //B队领先
    		}
    	}
    	printf("%lld",anss);
    	return 0;
    }
    

    说明:By Xin。本人乃2016级小学生,思路比较简单,题解如有写的不好的地方请指正。

    • 1

    信息

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