Codeforces Round #345 (Div. 2) B. Beautiful Paintings

B. Beautiful Paintings
time limit per test1 second
memory limit per test256 megabytes
inputstandard input
outputstandard output
There are n pictures delivered for the new exhibition. The i-th painting has beauty ai. We know that a visitor becomes happy every time he passes from a painting to a more beautiful one.

We are allowed to arranged pictures in any order. What is the maximum possible number of times the visitor may become happy while passing all pictures from first to last? In other words, we are allowed to rearrange elements of a in any order. What is the maximum possible number of indices i (1 ≤ i ≤ n - 1), such that ai + 1 > ai.

Input
The first line of the input contains integer n (1 ≤ n ≤ 1000) — the number of painting.

The second line contains the sequence a1, a2, …, an (1 ≤ ai ≤ 1000), where ai means the beauty of the i-th painting.

Output
Print one integer — the maximum possible number of neighbouring pairs, such that ai + 1 > ai, after the optimal rearrangement.

Examples
input
5
20 30 10 50 40
output
4
input
4
200 100 100 200
output
2
Note
In the first sample, the optimal order is: 10, 20, 30, 40, 50.

In the second sample, the optimal order is: 100, 200, 100, 200.

本题的题意就不多做解释了,,讲讲我对本题的理解吧,本题就是一道简单的贪心题目。。但可能我的方法是你见过的最特殊的吧,,我的方法用到了基础的桶排序,,加上特判就完事了,,否则的话,,这道题你就等着wrong answer 吧。。。。其实有一个更牛逼的方法。。

#include<cstdio>
#include<cstring>

int a[1005];
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        memset(a,0,sizeof(a));//为了使用桶排序,所以要对每个数的个数进行清零
        int num,flag=0;//flag用来记录找出的最大值
        for(int i=0;i<n;i++)
        {
            scanf("%d",&num);
            a[num]++;//每找到一个数它在数组中的个数就加一
            if(num>flag)
            {
                flag=num;
            }
        }
        int sum,sum1=0;
        for(int i=0;i<=1000;i++)//关键的实现贪心的步骤
        {
            sum=0;
            for(int j=0;j<=flag;j++)
            {
                if(a[j]>0)
                {
                    a[j]--;
                    sum++;
                }
            }
            if(sum!=0)//减掉的一个自己仔细想想,,就是n个数之间增加了n-1
            sum1+=(sum-1);
            else//进行特判,,表示已经不可能再增加了
            {
                break;
            }

        }
        printf("%d\n",sum1);
    }
    return 0;
}

下面是一种比较牛掰的方法

#include<cstdio>
int a[1001],b,n,i,max;
int main(){
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%d",&b);
        a[b]++;
        if(a[b]>max)max=a[b];
    }
    printf("%d",n-max);
    return 0;
}

如果看完博客有所收获,,别忘了收藏我的博客地址哦。。。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值