混沌DM

DM Hunter

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

http://acm.hdu.edu.cn/showproblem.php?pid=4476

题目意思:

  给定n条边,每条边可以选择切成两条,或者不切,询问最多能得到多少长度一样的边。

首先由于长度均为正整数,我们取长度为1,则答案至少为n,所以长度的取值应该小于等于 MaxLength/2.0 ,否则,答案不会超过n。

而对于给定的长度,所能得到的边的长度是可以直接算出来的,小于这个长度的能得到0条,等于这个长度2倍的能得到2条,其余的能得到一条。

为了避免0.5小数,代码里枚举的i是 长度的2倍。

代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 using namespace std;
 4 const int N=100000,N2=50000;
 5 int x,n,h[N+10],s[N+10],ans,tmp;
 6 int main()
 7 {
 8     int T;
 9     scanf("%d",&T);
10     while(T--)
11     {
12         scanf("%d",&n);
13         memset(h,0,sizeof(h));
14         for(int i=0;i<n;i++){
15             scanf("%d",&x);
16             h[x]++;
17         }
18         for(int i=1;i<=N2;i++)s[i]=s[i-1]+h[i];
19         ans=0;
20         for(int i=1;i<=N;i++){
21             tmp=h[i]-s[(i-1)>>1];
22             if(tmp>ans)ans=tmp;
23         }
24         printf("%d\n",ans+n);
25     }
26     return 0;
27 }

 

posted on 2012-12-02 14:18  混沌DM  阅读(204)  评论(0编辑  收藏  举报