Gym - 101291I Mismatched Socks 贪心

题意:

n个不同颜色,每种颜色有a[i]个 ,问:不同颜色间两两配对,最多能配对多少对?


思路:

设maxn为a[i]的最大值,sum为a[i]的和。

贪心的想,如果maxn*2>sum,那么我们用其他颜色全部去和maxn的颜色配对是最好的。如果maxn*2<=sum,这个时候我们把所有袜子按照颜色排序,比如颜色为1的有两个,颜色为2的有两个,颜色为3的有两个,那么排序后为1 1 2 2 3 3,因为每种颜色不会超过sum/2个,此时我们只要将下标为0的和下标为sum/2的配对,下标为1的和下标为sum/2+1的配对.....即可,所以如果是总共偶数个,可以全部配对,奇数个可以只剩下一个。


代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define IO ios::sync_with_stdio(false),cin.tie(0);
#define pb push_back
#define pii pair
#define mp make_pair
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define dep(i,a,b) for(int i=a;i>=b;i--)
#define mem(a,b) memset(a,b,sizeof(a))
#define debug(x) cout<<"["<>n;
    rep(i,1,n)scanf("%lld",&x),maxn=max(maxn,x),sum+=x;
    if(maxn*2>sum)printf("%lld\n",sum-maxn);
    else printf("%lld\n",sum/2);
}


你可能感兴趣的:(贪心)