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

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

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

 

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

#include
#include
#include
#include
#include
#include
#include
#include
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]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
#include
#include
#include
#include
#include
#include
#include
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]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;
}

 

转载于:https://www.cnblogs.com/letlifestop/p/10262876.html

你可能感兴趣的:(日常训练赛 Problem C – Complete Naebbirac’s sequence)