首页 > 其他 > 详细

HDU 5328 Problem Killer(水题)

时间:2015-07-31 12:09:03      阅读:241      评论:0      收藏:0      [点我收藏+]

 

 

题意:给一个序列,要找一个等差或等比的连续子序列,求其最长的长度。

 

思路:扫两遍,判断等差或等比即可。从左往右扫,维护一个滑动窗口,考虑新加进来的数,如果满足了要求,则更新长度,否则只留最后两个数字,其他删掉,接着继续考虑下一个数字。等比也是如此,只是要注意精度的问题。

 

  别人的代码:

技术分享
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int MAX = 1e6+2;
 4 int arr[MAX];
 5 
 6 int main(void)
 7 {
 8     //freopen("in.txt", "r", stdin);
 9     int t = 0;
10     scanf("%d", &t);
11     while(t--)
12     {
13         int n = 0;
14         scanf("%d", &n);
15 
16         for(int i=1; i<=n; ++i)
17         {
18             scanf("%d", &arr[i]);
19         }
20 
21         if (n==1 || n==2)
22         {
23             printf("%d\n", n);
24             continue;
25         }
26 
27         int l, r;
28         l = 1;
29         int diff = arr[2]-arr[1];
30         int ans1 = 2;
31         for(r=3; r<=n; ++r)
32         {
33             if (arr[r] - arr[r-1] != diff)
34             {
35                 diff = arr[r]-arr[r-1];
36                 l = r-1;
37             }
38             ans1 = max(ans1, r-l+1);
39         }
40 
41         l=1;
42         double ddiff = 1.0*arr[2]/arr[1];
43         int ans2 = 2;
44         for(r=3; r<=n; ++r)
45         {
46             if ( fabs( 1.0*arr[r]/arr[r-1] - ddiff) > 0.000001)
47             {
48                 ddiff = 1.0*arr[r]/arr[r-1];
49                 l = r-1;
50             }
51             ans2 = max(ans2, r-l+1);
52         }
53         printf("%d\n", max(ans1, ans2));
54     }
55     return 0;
56 }
AC代码

 

HDU 5328 Problem Killer(水题)

原文:http://www.cnblogs.com/xcw0754/p/4691501.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!