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 <cstdio>
#include <algorithm>
#include <iostream>
#include <vector>
#include <cstring>
#include <string>
#include <cmath>
#include <map>
#include <queue>
#include <bitset>
#include <stack>
#include <sstream>
#define IO ios::sync_with_stdio(false),cin.tie(0);
#define pb push_back
#define pii pair<int,int>
#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<<"["<<x<<"]"<<endl;
#define lson id<<1,l,mid
#define rson id<<1|1,mid+1,r
typedef long long ll;
using namespace std;
const double eps=1e-7;
const int MOD=1e9+7;
const ll INFLL=0x3f3f3f3f3f3f3f3f;
const int INF=0x3f3f3f3f;
const int MAXN=1e5+5;

int main() {
    ll n,x,maxn=0,sum=0;
    cin>>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);
}


猜你喜欢

转载自blog.csdn.net/c6376315qqso/article/details/77997614
今日推荐