P7203 [COCI2019-2020#3] Preokret

· · 题解

P7203 Preokret

这题就是个大模拟

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

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

重点来讲一下第三个问:

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

#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;//完美的结束 
}

理解万岁! 拒绝抄袭!

再次请求管理员可以通过