码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces - 931C 思路题

时间:2018-05-24 01:08:35      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:efi   ret   const   max   fine   生活   define   个人   ==   

题意:lpy决定在实验课上抄dzc大佬的实验数据,已知dzc大佬的数据共有n个,其中最大值与最小值之差最多为2,
lpy要魔改这n个数据满足数据的平均值和dzc的平均值一样,且最大值最小值分别不大于不小于dzc的最大值最小值
在此前提下魔改出两个人相同数据最少的方案

这题目太贴近生活了..
最大最小值差小于2时没法修改,直接输出
否则判断把中间的值折为两边还是两边折为中间划算

#include<bits/stdc++.h>
#define rep(i,j,k) for(register int i=j;i<=k;i++)
#define print(a) printf("%lld",(ll)(a))
#define println(a) printf("%lld\n",(ll)(a))
using namespace std;
const int MAXN = 1e5+11;
const int INF = 0x3f3f3f3f;
typedef long long ll;
int a[MAXN];
int main(){
    int n;
    while(cin>>n){
        rep(i,1,n) cin>>a[i];
        sort(a+1,a+1+n);
        int mn=INF,mx=-INF;
        rep(i,1,n){
            mn=min(mn,a[i]);
            mx=max(mx,a[i]);
        }
        if(mx-mn<=1){
            println(n);
            rep(i,1,n){
                if(i==n) println(a[i]);
                else printf("%d ",a[i]); 
            }
        }else{
            int mxcnt=0,mncnt=0,midcnt=0;
            rep(i,1,n){
                if(mx==a[i]) mxcnt++;
                else if(mn==a[i]) mncnt++;
                else midcnt++;
            }
            int mid=mx+mn>>1;
            int ans1=0,ans2=0;
            int t1=mxcnt,t2=midcnt,t3=mncnt;
            t1+=t2/2, t3+=t2/2; t2-=(t2/2)*2;
            rep(i,1,n){
                if(a[i]==mx&&t1) t1--,ans1++;
                else if(a[i]==mn&&t3) t3--,ans1++;
                else if(a[i]!=mx&&a[i]!=mn&&t2) t2--,ans1++;
            }
            t1=mxcnt,t2=midcnt,t3=mncnt;
            int t=min(t1,t3);
            t1-=t,t2+=t*2,t3-=t;
            rep(i,1,n){
                if(a[i]==mx&&t1) t1--,ans2++;
                else if(a[i]==mn&&t3) t3--,ans2++;
                else if(a[i]!=mx&&a[i]!=mn&&t2) t2--,ans2++;
            }
            println(min(ans1,ans2));
            t1=mxcnt,t2=midcnt,t3=mncnt;
            vector<int> vec;
            if(ans1<ans2){
                t1+=t2/2, t3+=t2/2; t2-=(t2/2)*2;
            }else{
                t1-=t,t2+=t*2,t3-=t;
            }
            rep(i,1,n){
                if(t1) vec.push_back(mx),t1--;
                else if(t2) vec.push_back(mid),t2--;
                else if(t3) vec.push_back(mn),t3--;
            }
            for(int i=0;i<vec.size();i++){
                if(i==(int)vec.size()-1) println(vec[i]);
                else printf("%d ",vec[i]);
            }
        }
    }
    return 0;
}

Codeforces - 931C 思路题

标签:efi   ret   const   max   fine   生活   define   个人   ==   

原文地址:https://www.cnblogs.com/caturra/p/9080557.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!