zoukankan      html  css  js  c++  java
  • lightoj Again Array Queries

    1100 - Again Array Queries
    Time Limit: 3 second(s) Memory Limit: 32 MB

    Given an array with n integers, and you are given two indices i and j (i ≠ j) in the array. You have to find two integers in the range whose difference is minimum. You have to print this value. The array is indexed from 0 to n-1.

    Input

    Input starts with an integer T (≤ 5), denoting the number of test cases.

    Each case contains two integers n (2 ≤ n ≤ 105) and q (1 ≤ q ≤ 10000). The next line contains n space separated integers which form the array. These integers range in [1, 1000].

    Each of the next q lines contains two integers i and j (0 ≤ i < j < n).

    Output

    For each test case, print the case number in a line. Then for each query, print the desired result.

    Sample Input

    Output for Sample Input

    2

    5 3

    10 2 3 12 7

    0 2

    0 4

    2 4

    2 1

    1 2

    0 1

    Case 1:

    1

    1

    4

    Case 2:

    1

    巧妙暴力:

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<cmath>
     6 using namespace std;
     7 #define mem(x,y) memset(x,y,sizeof(x))
     8 const int INF=0x3f3f3f3f;
     9 const double PI=acos(-1.0);
    10 const int MAXN=1e5+10;
    11 int m[MAXN];
    12 int cnt[1010];
    13 void getans(int l,int r){
    14     if(r-l>=1000){//因为数字范围1-1000; 
    15         puts("0");return;
    16     }
    17     mem(cnt,0);
    18     for(int i=l;i<=r;i++)
    19         cnt[m[i]]++;
    20     int k=-1,ans=1000;
    21     for(int i=1;i<=1000;i++){
    22         if(cnt[i]>1){
    23             ans=0;break;
    24         }
    25         if(cnt[i]){
    26         if(k!=-1&&i-k<ans)ans=i-k;
    27         k=i;
    28         }
    29     }
    30     printf("%d
    ",ans);
    31 }
    32 int main(){
    33     int T,n,q,flot=0;
    34     scanf("%d",&T);
    35     while(T--){
    36         scanf("%d%d",&n,&q);
    37         for(int i=0;i<n;i++)scanf("%d",m+i);
    38         printf("Case %d:
    ",++flot);
    39         while(q--){
    40             int l,r;
    41             scanf("%d%d",&l,&r);
    42             getans(l,r);
    43         }
    44     }
    45     return 0;
    46 }

     其实set写简单一些;

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<set>
    using namespace std;
    #define mem(x,y) memset(x,y,sizeof(x))
    const int INF=0x3f3f3f3f;
    const double PI=acos(-1.0);
    const int MAXN=1e5+10;
    set<int>st;
    int m[MAXN];
    int cnt[1010];
    void getans(int l,int r){
        if(r-l>=1000){//因为数字范围1-1000; 
            puts("0");return;
        }
        st.clear();
        mem(cnt,0);
        for(int i=l;i<=r;i++)
            st.insert(m[i]),cnt[m[i]]++;
        int ans=1000,k=-1;
        set<int>::iterator iter;
        for(iter=st.begin();iter!=st.end();iter++){
            if(cnt[*iter]>1){
                ans=0;break;
            }
            if(k!=-1&&*iter-k<ans)ans=*iter-k;
            k=*iter;
        }
        printf("%d
    ",ans);
    }
    int main(){
        int T,n,q,flot=0;
        scanf("%d",&T);
        while(T--){
            scanf("%d%d",&n,&q);
            for(int i=0;i<n;i++)scanf("%d",m+i);
            printf("Case %d:
    ",++flot);
            while(q--){
                int l,r;
                scanf("%d%d",&l,&r);
                getans(l,r);
            }
        }
        return 0;
    }
  • 相关阅读:
    WebApi集成Grpc客户端
    【Oracle】AWR报告生成
    ora-7445 导致 ora-600 ,oracle数据库 11gR2崩溃
    .NET的并发编程(TPL编程)是什么?
    打算写一些Netty的文章了,先聊聊为什么要学习Netty
    2020实战复盘:如何从0到1搭建数据传输平台产品DTS?
    DevOps,CI,CD,自动化简单介绍
    【python刷题】二叉树递归-非递归遍历-序列-反序列化
    python正则表达式-匹配用符号分割的多个字符串
    用 Flutter 搭建标签+导航框架
  • 原文地址:https://www.cnblogs.com/handsomecui/p/4918918.html
Copyright © 2011-2022 走看看