http://codeforces.com/problemset/problem/231/C
题意求一个序列中出现次数最多的数和它的次数,并且允许对这个序列中的数进行K次加1或不加
分析:一开始看这题就想到是排序加二分,但是不知道怎么二分,哎还是太弱。。。看了下别人的题解是二分答案,就是出现的次数。
View Code
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define MOD 100057 #define MAXN 100050 using namespace std; int a[MAXN]; long long s[MAXN]; int n,k; int check(int x){ for(int i=x;i<=n;i++){ if((long long)a[i]*x-(s[i]-s[i-x])<=k)return i; } return -1; } int main() { while(~scanf("%d%d",&n,&k)){ int aa; for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } sort(a+1,a+n+1); s[0]=0; for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i]; int l=1,r=n; int ans; int ansa; while(l<=r){ int mid=(l+r)>>1; int t=check(mid); if(t==-1)r=mid-1; else { ans=t;l=mid+1; ansa=mid; } } printf("%d %d\n",ansa,a[ans]); } return 0; }