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 Round #596 (Div. 2) ABCD题
codeforces730I Olympiad in Programming and Sports(姿势题 优先队列?dp?)