http://codeforces.com/problemset/problem/231/C
题意:
有 n 个数 ,你有 k 个 1 向这 n 个数加 (也可以 不加),求 使经过操作后 , 相同的数最多 为 多少,这个数的数值为多少?
题解:
排序 + 优化。。。。
1 #include<stdio.h>
2 #include<iostream>
3 #include<algorithm>
4 #include<cstring>
5 #include<cmath>
6 #include<queue>
7 #include<set>
8 #include<map>
9 #define Min(a,b) a>b?b:a
10 #define Max(a,b) a>b?a:b
11 #define CL(a,num) memset(a,num,sizeof(a));
12 #define inf 9999999
13 #define maxn 103000
14 #define eps 1e-6
15 using namespace std;
16 #define read() freopen("data.txt","r",stdin) ;
17 #define mod 1000000007
18 #define ll __int64
19 int n , m ;
20 ll a[maxn],s[maxn] ;
21 int main()
22 {
23 int i , j ;
24 //read() ;
25 while(scanf("%d%d",&n,&m)!=EOF)
26 {
27 for(i = 1 ; i <= n;i++) scanf("%I64d",&a[i]) ;
28
29 sort(a + 1,a+n + 1) ;
30 //for(i =0 ; i < n;i++) printf("%d +++++\n",a[i]) ;
31 s[0] = 0 ;
32 for(i = 1 ; i <= n;i++)
33 {
34 s[i] = s[i - 1] + a[i] ;
35 }
36 ll ans= 0 ;
37 ll t = a[0] ;
38 for(i = 1 ,j = 0; i <= n;i++)
39 {
40 while( a[i]*(i - j ) - ( s[i] - s[j]) > m && j < i)j++;
41
42 if(i - j > ans)
43 {
44 ans = i - j ;
45 t = a[i] ;
46 }
47
48 }
49 printf("%I64d %I64d\n",ans,t) ;
50 }
51 }
2 #include<iostream>
3 #include<algorithm>
4 #include<cstring>
5 #include<cmath>
6 #include<queue>
7 #include<set>
8 #include<map>
9 #define Min(a,b) a>b?b:a
10 #define Max(a,b) a>b?a:b
11 #define CL(a,num) memset(a,num,sizeof(a));
12 #define inf 9999999
13 #define maxn 103000
14 #define eps 1e-6
15 using namespace std;
16 #define read() freopen("data.txt","r",stdin) ;
17 #define mod 1000000007
18 #define ll __int64
19 int n , m ;
20 ll a[maxn],s[maxn] ;
21 int main()
22 {
23 int i , j ;
24 //read() ;
25 while(scanf("%d%d",&n,&m)!=EOF)
26 {
27 for(i = 1 ; i <= n;i++) scanf("%I64d",&a[i]) ;
28
29 sort(a + 1,a+n + 1) ;
30 //for(i =0 ; i < n;i++) printf("%d +++++\n",a[i]) ;
31 s[0] = 0 ;
32 for(i = 1 ; i <= n;i++)
33 {
34 s[i] = s[i - 1] + a[i] ;
35 }
36 ll ans= 0 ;
37 ll t = a[0] ;
38 for(i = 1 ,j = 0; i <= n;i++)
39 {
40 while( a[i]*(i - j ) - ( s[i] - s[j]) > m && j < i)j++;
41
42 if(i - j > ans)
43 {
44 ans = i - j ;
45 t = a[i] ;
46 }
47
48 }
49 printf("%I64d %I64d\n",ans,t) ;
50 }
51 }