日常训练赛 Problem C – Complete Naebbirac’s sequence

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Let_life_stop/article/details/82929405

比赛链接https://vjudge.net/contest/256988#status/17111202012/C/0/

大意:三个操作,使得输入的数中,从1-n,每一个数出现的次数相同。

wa代码(只是考虑了三个数的情况):

#include<iostream>
#include<string>
#include<map>
#include<vector>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<stdio.h>
using namespace std;
# define maxn 1000+10
# define inf 0x3f3f3f3f
int vis[maxn];
int main()
{
    int n,m;
    memset(vis,0,sizeof(vis));
    scanf("%d%d",&n,&m);
    for(int i=1; i<=m; i++)
    {
        int temp;
        scanf("%d",&temp);
        vis[temp]++;
    }
    if((m+1)%n==0)
    {
        int t=(m+1)/n;
        int num1=0,num2=0;
        int s=0;
        for(int i=1; i<=n; i++)
        {
            if(vis[i]!=t)
            {
                num1++;
                num2=vis[i];
                s=i;
            }
        }
        if(num1==1&&num2==t-1)
        {
            printf("+%d\n",s);
            return 0;
        }
    }
    if((m-1)%n==0)
    {
        int t=(m-1)/n;
        int num1=0,num2=0;
        int s=0;
        for(int i=1; i<=n; i++)
        {
            if(vis[i]!=t)
            {
                num1++;
                num2=vis[i];
                s=i;
            }
        }
        if(num1==1&&num2==t+1)
        {
            printf("-%d\n",s);
            return 0;
        }
    }
    if(m%n==0)
    {
               int temp=m/n;
        int s1=inf,s2=-inf,w1,w2;
        for(int i=1; i<=n; i++)
        {
            if(vis[i]<s1)
            {
                s1=vis[i];
                w1=i;
            }//出现的最小次数
            if(vis[i]>s2)
            {
                s2=vis[i];
                w2=i;
            }//出现的最多次数
        }
        if(s1==s2-2&&s1+1==temp)
        {
            printf("-%d+%d\n",w2,w1);
            return 0;
        }
    }
    printf("*\n");
    return 0;
}

AC代码(新思路,按照平均数来找):

#include<iostream>
#include<string>
#include<map>
#include<vector>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<stdio.h>
using namespace std;
# define maxn 1000+10
# define inf 0x3f3f3f3f
int vis[maxn];
int main()
{
    int n,m;
    memset(vis,0,sizeof(vis));
    scanf("%d%d",&n,&m);
    for(int i=1; i<=m; i++)
    {
        int temp;
        scanf("%d",&temp);
        vis[temp]++;
    }
    if((m+1)%n==0)
    {
        int t=(m+1)/n;
        int num1=0,num2=0;
        int s=0;
        for(int i=1; i<=n; i++)
        {
            if(vis[i]!=t)
            {
                num1++;
                num2=vis[i];
                s=i;
            }
        }
        if(num1==1&&num2==t-1)
        {
            printf("+%d\n",s);
            return 0;
        }
    }
    if((m-1)%n==0)
    {
        int t=(m-1)/n;
        int num1=0,num2=0;
        int s=0;
        for(int i=1; i<=n; i++)
        {
            if(vis[i]!=t)
            {
                num1++;
                num2=vis[i];
                s=i;
            }
        }
        if(num1==1&&num2==t+1)
        {
            printf("-%d\n",s);
            return 0;
        }
    }
    if(m%n==0)
    {
               int temp=m/n;
        int s1=inf,s2=-inf,w1,w2;
        for(int i=1; i<=n; i++)
        {
            if(vis[i]<s1)
            {
                s1=vis[i];
                w1=i;
            }//出现的最小次数
            if(vis[i]>s2)
            {
                s2=vis[i];
                w2=i;
            }//出现的最多次数
        }
        if(s1==s2-2&&s1+1==temp)
        {
            printf("-%d +%d\n",w2,w1);
            return 0;
        }
    }
    printf("*\n");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Let_life_stop/article/details/82929405