10分求助(有部分测试点超时)
查看原帖
10分求助(有部分测试点超时)
87549
石哈哈楼主2021/9/25 16:05
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int length = 10001;
int N,M,R;
int n[length],au_sp[length];

int sum(int l,int r)
{
    int sum_ = 0;
    for(int i = l;i<=r;i++)
    {
        sum_ = sum_ + au_sp[i]*(r-i+1);
    }
    return sum_;
}

void search(int l,int r,int k)
{
    int mid = (l+r)/2;
   // printf("l = %d r = %d ",l,r);
    if (l == r) 
    {
        R = l ;
        //printf("R = %d\n",R);
        return;
    }
    //printf("sum = %d\n",sum(l,N-1));
    if (k < sum(l,N-1)) search(mid,r,k);
    if (k >= sum(l,N-1)) search(l,mid,k);
}

int main()
{
    int sum_ = 0,high = 0;
    scanf("%d%d",&N,&M);
    for (int i = 0; i < N; i++)scanf("%d",&n[i]);
    sort(n,n+N);
    for(int i = 1;i<N;i++)au_sp[i] = n[i] - n[i-1];
    au_sp[0] = n[0];
    //for (int i = 0; i < N; i++)printf("%d ",n[i]);printf("\n");
    //for (int i = 0; i < N; i++)printf("%d ",au_sp[i]);printf("\n");
    search(0,N-1,M);
    //printf("R = %d\n",R);
    for(int i = R;i<N;i++)
    {
        sum_ = sum_ + au_sp[i]*(N-i);
    }
    //printf("sum_ = %d\n",sum_);
    M = M - sum_;
    while(M>0)
    {
        M = M - (N-R+1);
        //printf("M=%d\n",M);
        high++;
    }
    printf("%d",n[R-1]-high);
    return 0;
}

2021/9/25 16:05
加载中...