• 日常训练赛 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;
    }
    
  • 相关阅读:
    Kali Linux渗透基础知识整理(二)漏洞扫描
    Elasticsearch为记录添加时间戳timestamp
    手把手带你使用JS-SDK自定义微信分享效果
    SpringBoot学习(3)-SpringBoot添加支持CORS跨域访问
    Java 骚操作--生成二维码
    清除微信内置浏览器缓存
    使用python脚本Telnet 华为交换机备份配置
    如何备份思科、锐捷、Juniper的配置文件
    微信公众平台开发教程Java版(六) 事件处理(菜单点击/关注/取消关注)
    How do you build a database?
  • 原文地址:https://www.cnblogs.com/letlifestop/p/10262877.html
Copyright © 2020-2023  润新知