Codeforces - 931C 思路题

Posted caturra

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces - 931C 思路题相关的知识,希望对你有一定的参考价值。

题意: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 思路题的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces 一眼题系列

Codeforces Round #456 B题

Codeforces Round #596 (Div. 2) ABCD题

codeforces730I Olympiad in Programming and Sports(姿势题 优先队列?dp?)

CodeForces - 964A(找规律)

Codeforces Round #719 (Div. 3) A-G题解 G题详细注释