codeforces To Add or Not to Add (排序 + 优化)

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 }
原文地址:https://www.cnblogs.com/acSzz/p/2743937.html