zoukankan      html  css  js  c++  java
  • JZ初中OJ 2292. [noip普及组1]区间

    题目描述

    有一个长度为N的序列a[1],a[2]…a[N]。对于一个包含a[L],a[L+1]…a[R]的区间[L,R],小W认为如果存在一个位置a[K]满足区间内所有的数都是a[K]的倍数,那么这个区间是合法的,并且这个区间的价值为R-L,否则这个区间是不合法的。现在小W想知道所有合法的区间中价值最大的区间价值是多少,并且你要告诉他这些区间的左端点(如果有多个区间的价值等于最大值,那么你需要告诉他所有的左端点)。
     

    输入

    第一行一个数N,表示数的个数。
    第二行N个空格隔开的正整数,表示a[1],a[2]…a[N]。
     

    输出

    第一行两个数x,y,分别表示价值最大的区间的个数以及最大价值。
    第二行若干个由空格隔开的整数,从小到大输出价值最大的区间的左端点。
     

    样例输入

    【样例输入1】
    5
    4 6 9 3 6
     
    【样例输入2】
    30
    15 15 3 30 9 30 27 11 5 15 20 10 25 20 30 15 30 15 25 5 10 20 7 7 16 2 7 7 28 7
     
     

    样例输出

    【样例输出1】
    1 3
    2
     【样例输出2】
    1 13
    9
     
     

    数据范围限制

    对于30%的数据,满足N<=30,a[i]<=50
    对于70%的数据,满足N<=3000,a[i]<=2000
    对于100%的数据,满足N<=300000,a[i]<=2000000
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 #define mod 1000000007
     4 #define ll long long
     5 const int N = 300010;
     6 int n;
     7 int a[N];
     8 int ans1, ans2;
     9 int ans[N];
    10 int main()
    11 {
    12     freopen("interval.in", "r", stdin);
    13     freopen("interval.out", "w", stdout);
    14     scanf("%d", &n);
    15     for (int i = 1; i <= n; i++)
    16         scanf("%d", &a[i]);
    17     for (int k = 1; k <= n; k++)
    18     {
    19         int l, r;
    20         for (l = k; l >= 1; l--)
    21             if(l == 1 || a[l - 1] % a[k] != 0)
    22                 break;
    23         for (r = k; r <= n; r++)
    24             if(r == n || a[r + 1] % a[k] != 0)
    25                 break;
    26         if(ans2 < (r - l))
    27         {
    28             ans1 = 1;
    29             ans[ans1] = l;
    30             ans2 = r - l;
    31         }
    32         else
    33         {
    34             if(ans2 == (r - l))
    35             {
    36                 ans[++ans1] = l;
    37             }
    38         }
    39     }
    40     sort(ans + 1, ans + 1 + ans1);
    41     ans1 = unique(ans + 1, ans + 1 + ans1) - (ans + 1);
    42     printf("%d %d
    ", ans1, ans2);
    43     for (int i = 1; i <= ans1; i++)
    44         printf("%d ", ans[i]);
    45     return 0;
    46 }
  • 相关阅读:
    oracle 添加用户
    oracle---存储结构及其之间的关系和创建数据库
    oracle---临时表空间
    对字符串进行加密解密知识
    面向对象---函数重复---原型
    Ajax
    sqlHelper+app.config
    sqlHelper ---转载
    web.config中的连接字符串 ---关于 providerName 特性---转载
    SQL中的cast()函数--转载
  • 原文地址:https://www.cnblogs.com/dsanying/p/11317259.html
Copyright © 2011-2022 走看看