codeforces 231 C To Add or Not to Add 贪心

来源:互联网 发布:cacti的linux镜像 编辑:程序博客网 时间:2024/06/05 11:55

做法:进行从小到大排序,这样可以使最接近的几个数都聚在一起,然后用(i-j+1)*a[i]-sum;sum-=a[j++];这样可以以i-j+1为重复次数,算出重复最多的数,然后以为是从小到大排列的,又可以找出最小数。

#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>#include <utility>#define LL long long#define LMT 100003//化分离数为块,贪心题using namespace std;int a[LMT];int main(){    int n,k;    LL sum=0;    pair<int,int> ans;    scanf("%d%d",&n,&k);    for(int i=0;i<n;i++)    scanf("%d",&a[i]);    sort(a,a+n);    ans.first=0;ans.second=0;    for(int i=0,j=0;i<n;i++)    {        sum+=a[i];        while((i-j+1LL)*a[i]-sum>k)sum-=a[j++];        if(ans.second<i-j+1LL)        ans=make_pair(a[i],i-j+1LL);    }    printf("%d %d\n",ans.second,ans.first);    return 0;}


原创粉丝点击