【普及二】【二分】【小信的数组】WA8

#include<bits/stdc++.h>
#define N 100005
#define M 100005
#define int long long
using namespace std;
int a[N],n,k,sum,tp,s;
bool check(int mid)
{
  int tsum=0;
  for(int i=1;i<=n;i++)
	{
    tsum+=min(a[i],mid);
  }
  tsum=n-sum;
  return tsum<k;
}
signed main()
{
  cin>>n>>k;
  for(int i=1;i<=n;i++)
	{
    cin>>a[i];
    sum+=a[i];
  }
  int l=0,r=sum/k;
  while(l<r)
	{
    int mid=(l+r+1)/2;
    if(check(mid))
		{
      l=mid;
    }
    else
		{
      r=mid-1;
    }
  }
  l=max(l,r);
  for(int i=1;i<=n;i++)
	{
    s+=min(a[i],l);
    a[i]=max(a[i]-l,tp);
  }
  for(int i=1;i<=n&&s<k;i++)
	{
  	if(a[i]>0)
		{
  	  a[i]--;
  	  s++;
		}
  }
  for(int i=1;i<=n;i++)
	{
  	cout<<a[i]<<" ";
  }
  return 0;
}
2 个赞

这部分为什么到n就结束了? 不应该剩余操作全部执行完么

3 个赞