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了。不过最关键的还是题意要搞懂!

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 }

 

posted @ 2012-02-03 15:59  笑巧  阅读(331)  评论(0编辑  收藏  举报