Codeforces - 931C 思路題
阿新 • • 發佈:2018-05-24
修改 思路題 urn mes rep 題目 i++ gist inf
題意: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 思路題