Help 万能的古民
  • 板块灌水区
  • 楼主Mercedes_AMG
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/3/19 19:11
  • 上次更新2024/3/19 20:50:06
查看原帖
Help 万能的古民
1044345
Mercedes_AMG楼主2024/3/19 19:11

K. 加数

时间限制 100 毫秒

内存限制 128 MB

描述

给定一个长度为n的序列a1,a2…an,请你把其中一些数进行若干次+1操作,且操作总次数不超过k,使得原序列中某数出现的次数最多。求操作之后相同的数出现最多的次数,以及相应的这个数。

输入

第一行两个整数 n,k,即序列的长度和操作总次数;

第二行为a1,a2…an。

输出

两个整数,以空格分隔,分别为出现最多的数的次数和出现最多的数。

如果有多个满足条件的数,输出值最小的一个。

样例

top:1

输入

5 3

6 3 4 0 2

输出

3 4

top:2

输入

3 4

5 5 5

输出

3 5

top:3

输入

5 3

3 1 2 2 1

输出

4 2

我的代码

#include <bits/stdc++.h>
using namespace std;
long long int a[1001001];
long long int f[1001001];
long long int n,m;
bool check(long long int s)
{
    long long int q=m;
    long long int p=0;
    long long int k=0;
    long long int ll=1,rr=1;
    for(long long int i=1; i<=n; i++) {
        long long int h;
        p=q;
        k=0;
        for(long long int j=1; j<=n; j++) {
            if(i!=j&&a[i]>=a[j]) {
                if(p>0) {
                    f[rr]=abs(a[i]-a[j]);
                    p-=f[rr];
                    rr++;
                    k++;
                } else {
                    ll++;
                    p+=f[ll-1];
                    k--;
                }
                if(k>=s) return true;
            }
        }
    }
    if(p>=0) {
        if(k>=s) return true;
    }
    return false;
}
int main()
{
    cin>>n>>m;
    for(long long int i=1; i<=n; i++) {
        cin>>a[i];
    }
    long long int l=1;
    long long int r=n;
    long long int mid;
    long long int ans;
    while(l<=r) {
        mid=(l+r)/2;
        if(check(mid)) {
            ans=mid;
            l=mid+1;
        } else {
            r=mid-1;
        }
    }
    cout<<ans+1<<" "<<a[ans+1];
    return 0;
}

测评结果

QWQ:in为何运行出错

2024/3/19 19:11
加载中...