Codeforces 1008C

题意略。

思路:

其实我们没有必要关注每个数字的位置,我们只要把大的数字放在小的数字上就可以了,这样它的位置必然会发生变换。

在变换时,这个替换的序列越长越好,每个序列对答案的贡献就是该序列的长度 - 1。

我们可以把这个题抽象为一个柱形图,每个柱子的下标为某个数字,且从左向右下标数字减小,该柱子的高度就是该数字出现的次数。

我们要完成一个尽可能长的序列,也就是从该柱形图的左边一直贯穿到右边,柱形图中的高度最高者就是替换的序列数。

在该柱形图中,一个序列的高度为1。

所以不难想到,ans = 柱形图总面积 - max(height)。

详见代码:

#include<bits/stdc++.h>
using namespace std;

map<int,int> mp;

int main(){
    int n;
    int temp;
    scanf("%d",&n);
    int maxx = 0;
    for(int i = 0;i < n;++i){
        scanf("%d",&temp);
        ++mp[temp];
        maxx = max(maxx,mp[temp]);
    }
    printf("%d\n",n - maxx);
    return 0;
}

 

posted @ 2018-07-24 21:05  温和的提比略  阅读(104)  评论(0编辑  收藏  举报