Codeforces Round #143 (Div. 2) C
生活随笔
收集整理的這篇文章主要介紹了
Codeforces Round #143 (Div. 2) C
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
http://codeforces.com/contest/231/problem/C
昨天的cf。比賽的時候其實有點思路的,但是因為B搞錯方向了沒敢寫C。剛剛寫了下,AC了。用的思路還真是昨天晚上的。囧。昨天晚上看的時候有一個地方不知道怎么轉換,就是怎么快速求出i-->i+ans需要加多少個1.剛剛化了下。得到了:cnt=sum[i-1+m]-sum[i]-(i-1)*(a[i-1+m]-a[i])。sum[i]表示1-->i需要加多少個1使得1-->i都變為a[i]。自己寫下就能得到上面那個式子。昨天就是這里沒深入。
然后剛剛做的時候想到了 sum[]定義為__int64 覺得a數組應該不需要定義為__int64的??墒清e了。改了后AC了。。不知道為啥。。。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 #include <algorithm> 6 #include <cmath> 7 #include <stack> 8 9 using namespace std; 10 11 #define MAXN 100010 12 __int64 a[MAXN]; 13 __int64 sum[MAXN];//前i個數加多少個數使得前i個數變為a[i] 14 int n,k; 15 16 int main() 17 { 18 while(scanf("%d%d",&n,&k) != EOF) 19 { 20 for(int i=1;i<=n;i++) 21 scanf("%I64d",&a[i]); 22 sort(a+1,a+n+1); 23 sum[0]=0; 24 sum[1]=0; 25 for(int i=2;i<=n;i++) 26 sum[i]=sum[i-1]+(i-1)*(a[i]-a[i-1]); 27 int ans; 28 int num; 29 int left=1,right=n; 30 while(left<=right) 31 { 32 int m=(left+right)>>1; 33 bool flag=0; 34 int i=1; 35 for(i=1;i-1+m<=n;i++) 36 if(sum[i-1+m]-sum[i]-(i-1)*(a[i-1+m]-a[i])<=k) 37 { 38 flag=1; 39 break; 40 } 41 if(flag) 42 { 43 left=m+1; 44 ans=m; 45 num=a[i-1+m]; 46 } 47 else 48 right=m-1; 49 } 50 printf("%d %d\n",ans,num); 51 } 52 return 0; 53 }轉載于:https://www.cnblogs.com/Missa/archive/2012/10/08/2715765.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Codeforces Round #143 (Div. 2) C的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PG git pull
- 下一篇: oracle学习一二