ZOJ2091(贪心)

解题思路:刚读完这道题后,不懂什么意思,感觉挺奇怪的。看了几遍题后,还是无从下手。通过动笔画画与测试数据结果对住了,觉得应该是这个意思,也确实是的。题目意思的正确理解应当是,从任意位置开始一直取到末尾,然后求其平均值,把这n个平均值中取最大的一个输出。也是按照贪心原则求解问题。
      如Sample:
      10
      2 10 4 6 5 10 10 2 3 2
      取
         <1> (2 + 10 + 4 + 6 + 5 + 10 + 10 + 2 + 3 + 2 ) / 10
         <2>(10 + 4 + 6 + 5 + 10 + 10 + 2 + 3 + 2) / 9
         <3>( 4 + 6 + 5 + 10 + 10 + 2 + 3 + 2) / 8
         <4>( 6 + 5 + 10 + 10 + 2 + 3 + 2) / 7
         <5>(5 + 10 + 10 + 2 + 3 + 2) / 6
         <6>(10 + 10 + 2 + 3 + 2) / 5
         <7>(10 + 2 + 3 + 2) / 4
         <8>(2 + 3 + 2) / 3
         <9>( 3 + 2) / 2
         <10>2 / 1
      在这10个数里取一个最大值输出即可。

  注意:这题竟然没有给数据量大小,确实挺难为人的。开始我设了1005的上限,检查无误提交竟然是Segmentation Fault,让我看了半天不知道是什么错误,以前从没见过。我猜是不是数据量设的太小了,就改为10005的上限,结果终于AC了。不过最关键的还是题意要搞懂!

ExpandedBlockStart.gif View Code
 1 #include<iostream>
 2 #include<cstdio>
 3  using  namespace std;
 4 
 5  #define Max 10005
 6  double a[Max],b[Max];
 7 
 8  int main()
 9 {
10      int i,n;
11      while(cin>>n)
12     {
13          for(i= 0;i<n;i++)
14             cin>>a[i];
15          double sum= 0.0;
16          for(i=n- 1;i>= 0;i--)
17         {
18             sum+=a[i];
19             b[i]=sum/(n-i);
20         }
21          double max= 0;
22          for(i= 0;i<n;i++)
23              if(max<b[i]) max=b[i];
24         printf( " %.6f\n ",max);
25     }
26      return  0;
27 }

 

转载于:https://www.cnblogs.com/yueshuqiao/archive/2012/02/03/2337225.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值