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