B
每次找数组中的一对数-1
最终能否使数组元素全为0
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii; //1e9
typedef pair<ll,ll> pll;
const int maxn=4e5+5;
const int INF=0x3f3f3f3f;
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define forn(i,n) for(int i=0;i<n;i++)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
int n;
int a[maxn],maxx=0;
ll ans=0;
int main()
{
cin>>n;
rep(i,1,n){
cin>>a[i];
ans+=a[i];
maxx=max(maxx,a[i]);
}
if(ans%2==0 && ans>=2*maxx) //1 2 3 4 8 √
//1 2 3 4 10 √
//1 2 3 4 12 x
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
return 0;
}
每次操作可以使任意ai+1 n一定为奇数
进行k次操作后 使中位数尽可能大 求最大中位数
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii; //1e9
typedef pair<ll,ll> pll;
const int maxn=4e5+5;
const int INF=0x3f3f3f3f;
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define forn(i,n) for(int i=0;i<n;i++)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
ll n,k;
ll a[maxn],maxx=0;
bool check(ll mid){ //理想中位数 当然有可能比原先的中位数大
int m=n/2+1;
ll ans=0;
for(int i=n;i>=m;i--){
if(mid>a[i]){
ans+=mid-a[i];
}
}
return ans<=k;
}
int main()
{
cin>>n>>k; //k次+1机会重复利用
rep(i,1,n){
cin>>a[i];
}
sort(a+1,a+n+1);
ll l=1,r=2e9,res=0;
while(l<=r){ //二分找合适的中位数 中位数以后的值都变成中位数 中位数还是它本身 中位数可以是1e9
ll mid=(l+r)>>1;
if(check(mid)){
res=mid;
l=mid+1;
}
else
r=mid-1;
}
cout<<res<<endl;
return 0;
}