Laboratory Work
传送门
题意:给你一个长为n的序列,该序列的元素之间的差值不超过二,现在要你找出一个新的大小同为n的序列,其平均数于原序列相等,并且里面的元素大小要在原序列的范围之内。
思路:要求大小为n,平均数相等,元素大小范围在原序列内,这说明要求在原序列中元素之间进行转化,而能转化的只有一种—a+1 + a+3 = 2*(a+2) 所以进行判断转化就可以了
#include <iostream>
#include <fstream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <cmath>
#include <algorithm>
#include <functional>
#define inf 10000000
using namespace std;
typedef long long ll;
const int MAXN=1e9+10;
const int MAX=1e5+10;
const double eps=1e-6;
ll n;
ll s[MAX];
ll a=0,b=0,c=0;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("in.txt","r",stdin);
#endif
cin>>n;
ll minn;
for(ll i=1;i<=n;i++){
scanf("%lld",&s[i]);
if(i==1) minn=s[i];
else minn=min(minn,s[i]);
}
for(ll i=1;i<=n;i++){
s[i]-=minn;
if(s[i]==0) a++;
else if(s[i]==1) b++;
else c++;
}
sort(s+1,s+n+1);
if(c==0||a==0){
cout<<n<<endl;
for(int i=1;i<=n;i++){
if(i==1) cout<<s[i]+minn;
else cout<<" "<<s[i]+minn;
}
cout<<endl;
return 0;
}
else{
ll ans=0;
ll temp_b=b/(ll)2;
ll temp_ac=min(a,c);
if(temp_b>temp_ac){
ans=a+c;
b-=temp_b*2;
a+=temp_b;
c+=temp_b;
ans+=b;
}
else{
ans=b;
b+=temp_ac*2;
a-=temp_ac;
c-=temp_ac;
ans+=a+c;
}
int juge=0;
cout<<ans<<endl;
for(ll i=1;i<=a;i++){
if(!juge) cout<<minn;
else cout<<" "<<minn;
juge=1;
}
for(ll i=1;i<=b;i++){
if(!juge) cout<<minn+(ll)1;
else cout<<" "<<minn+(ll)1;
juge=1;
}
for(ll i=1;i<=c;i++){
if(!juge) cout<<minn+(ll)2;
else cout<<" "<<minn+(ll)2;
juge=1;
}
cout<<endl;
}
return 0;
}