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;
}

 

转载于:https://www.cnblogs.com/tiberius/p/9362611.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值