• 江西理工大学南昌校区排名赛 A: 单身狗的卡片游戏


    题目描述

    萌樱花是一只单身狗。

    萌樱花今天在桌子上摆出了N张卡片,每张卡片i写着一个数字Ai

    他不喜欢卡片上的数字多个出现,于是他想搞点事情拆分它们。

    从桌子上选出三张卡,去掉一张数字最大,一张数字最小,然后留下中间那张放回桌子上,

    这样的操作持续到桌子上的卡片显示的数字都是唯一的才停止。

    那么最后桌子上最多可以留下多少张卡片呢?

    输入

    3<=N<=105

    N是奇数,这样保证绝对可以留下一张

    1<=Ai<=105

    Ai是整数

    输入格式:

    N

    A1 A2 A3 .....AN

    输出

    输出 最后桌子上能留下多少张卡

    样例输入

    5
    1 2 1 3 7

    样例输出

    3

    提示

     我们选取1 1 2,去掉最大2,最小1,留下中间的1,最后桌子上只剩下1 3 7,一共三张卡

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
        int n;
        int a[200000];
        cin>>n;
        for(int i=0;i<n;i++)
        {
            cin>>a[i];
        }
        sort(a,a+n);
        int x=unique(a,a+n)-a;
        if(x%2)
        {
            cout<<x;
        }
        else
        {
            cout<<x-1;
        }
        return 0;
    }
    #include<stdio.h>  
    #include<string.h>  
    #include<queue>  
    #include<algorithm>  
    using namespace std;  
    int a[100006];  
    int vis[100006];  
    int main()  
    {  
        int n;  
        while(~scanf("%d",&n))  
        {  
            memset(vis,0,sizeof(vis));  
            for(int i=0;i<n;i++)  
            {  
                scanf("%d",&a[i]);  
                vis[a[i]]++;  
            }  
            int j=100002;  
            for(int i=1;i<=100002;i++)  
            {  
                if(vis[i]>1)  
                {  
                    while(vis[j]<=1&&j>i)j--;  
                    if(j>i)  
                    {  
                        if(vis[i]==vis[j])vis[i]=1,vis[j]=1;  
                        else if(vis[i]>vis[j])  
                        {  
                            vis[i]-=vis[j]-1;  
                            vis[j]=1;  
                            i--;  
                        }  
                        else if(vis[i]<vis[j])  
                        {  
                            vis[j]-=vis[i]-1;  
                            vis[i]=1;  
                            j++;  
                        }  
                    }  
                }  
            }  
            int output=0;  
            for(int i=1;i<=100002;i++)  
            {  
                if(vis[i]==1)output++;  
                if(vis[i]>1)  
                {  
                    if(vis[i]%2==0)continue;  
                    else output++;  
                }  
            }  
            printf("%d
    ",output);  
        }  
    }  
  • 相关阅读:
    UVA 12657 Boxes in a Line 双向链表模拟
    C语言单片和C#语言服务器端DES及3DES加密的实现
    关于TcpClient,Socket连接超时的几种处理方法
    拿来参考的学习计划
    faire la course
    今日法语2
    炸鱼
    今日法语
    今日疑问
    下周想做的菜
  • 原文地址:https://www.cnblogs.com/yinghualuowu/p/9494669.html
Copyright © 2020-2023  润新知