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

4953 단어 codeforces
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
"
,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;
}

만약 블로그를 보고 얻은 것이 있다면, 나의 블로그 주소를 수집하는 것을 잊지 마세요...

좋은 웹페이지 즐겨찾기