Codeforces Round #497 C (脑洞)

题意:给你一个数组a[i],让你将这个数组重新排列b[i],问你b[i] - a[i] > 0 的最大数目是多少。
思路
我们先不考虑每个数组的位置,按照贪心的思路的话,第一小的位置在重新排列之后一定要放第二小的,然后原来最大的位置一定要放第一小的这样的话,我们的数目才会最大,对吧,比如
1 2 3 4 5 那么我们一定要放
2 3 4 5 1 这样最大,不用考虑顺序问题,因为我第一小总能找到第二小,所以顺序其实无所谓对吧。
那么如果有重复的话,那么比如第一小的有重复,那么我第一小的位置就不能放第二小的了 ,要一次往回推,这样的话其实就是我们要找到相同的最大的那个就好了。
代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
int a[maxn];
map<int,int>M;
int main()
{
    int n;
    scanf("%d",&n);
    int maxn = -1;
    for(int i = 0 ; i < n ; i++)
    {
        scanf("%d",&a[i]);
        M[a[i]]++;
        maxn = max(M[a[i]],maxn);
    }
    cout<<n-maxn<<endl;
}

猜你喜欢

转载自blog.csdn.net/wjmwsgj/article/details/81041139