1 条题解

  • 0
    @ 2025-8-24 22:27:37

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar JF
    天真在这条路上 / 跌跌撞撞 / 他被芒草割伤 ||越渴望着实现目标,那赶紧给我行动起来,跟他爆了 ||情为何物,生死相许

    搬运于2025-08-24 22:27:37,当前版本为作者最后更新于2021-12-04 19:59:58,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    P7203 Preokret

    这题就是个大模拟

    第一个问就是要算两队的得分情况。即在输入的时候用两个计数器进行统计即可,最后输出答案,第一个问就解决了。

    第二个问题是要算打平的次数。注意题目有声明 0:00:0 也是一种平手,所以变量初始时应该为 11

    重点来讲一下第三个问:

    首先我们要在遍历整个过程时,重新统计得分。当当前的数字和下一个数字不一样的时候,那么就有可能出现翻盘的情况。但是要在 numnumsumsum 不相同的情况下。接着就再往下枚举,如果和当前的值不一样,证明有进球了。最后用 maxxmaxx 统计出最大的翻盘球的数量即可。

    #include<bits/stdc++.h>
    using namespace std;
    #define LL long long
    const int N = 1e5 + 10;
    const int INF = 0x3f3f3f3f;
    int a[N];
    int main()
    {
    	int n;
    	cin>>n;
    	for(int i=1;i<=n;i++)	
    		cin>>a[i];
    	int sum=0,ans=1,num=0;//ans=1是因为0:0也算作一个平局 ,sum是A队 num是B队 
    	for(int i=1;i<=n;i++)
    	{
    		if(a[i]==1)
    			sum++;
    		else if(a[i]==2)
    			num++;//分类讨论 
    		if(sum==num)//平局的操作 
    			ans++;
    	}
    	cout<<sum<<" "<<num<<endl;
    	cout<<ans<<endl;// 第一和第二个操作 
    	int maxx=0;
    	sum=0,num=0;
        for(int i=1;i<=n;i++)
        {
        	if(a[i]==1)
    			sum++;
    		else if(a[i]==2)
    			num++;
        	int sheng=0;
        	if(a[i+1]!=a[i]&&((num>sum)||(sum>num)))//当当前的数字和下一个数字不一样的时候,那么就有可能出现翻盘的情况。但是要在num和sum不相同的情况下 
        	{
        		for(int j=i+1;j<=n;j++)//枚举下一个数的情况 
        		{
        			if(a[j]!=a[i])//若不一样,视为进球 
        				sheng++;
        			else
        				break;
    			}
    			if(a[i]==1)
    			{
    				if(num+sheng>sum)
    					maxx=max(maxx,sheng);
    			}
    			else 
    			{
    				if(sum+sheng>num)
    					maxx=max(maxx,sheng);
    			}
    			//操作一样 统计 maxx的最大的数 
    		}
    	}
    	cout<<maxx<<endl;//输出 
    	return 0;//完美的结束 
    }
    

    理解万岁! 拒绝抄袭!

    再次请求管理员可以通过

    • 1

    信息

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