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


    比赛链接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
    ",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
    ",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
    ",w2,w1);
                return 0;
            }
        }
        printf("*
    ");
        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
    ",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
    ",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
    ",w2,w1);
                return 0;
            }
        }
        printf("*
    ");
        return 0;
    }
    
  • 相关阅读:
    推荐:VisualStudio 2005/2008的“Consolas”字体包
    [转]Calendar 動態產生子控制項的 Event Handler, 模拟__doPostBack() 回发
    Ajax ToolKit ModelPopupExtender应用经验二则
    [转]Calendar 控件日期复选
    ASP.NET偷懒大法六(可空类型的动态赋值)
    弹出层(Div)屏蔽父窗口并且让父窗口变暗
    CSS巧用expression来区分只读文本框
    formValidator用户注册表单自动验证
    基于Session原理的验证码方案
    jQuery解决IE6下PNG图片背景透明问题
  • 原文地址:https://www.cnblogs.com/letlifestop/p/10262877.html
Copyright © 2020-2023  润新知