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;
    }
  • 相关阅读:
    当函数中传递的参数数量不定时,获取传递给函数的参数信息
    redis分页摘抄
    redis分页
    返回数组中指定的一列,将键值作为元素键名array_column
    PHP操作Redis常用技巧总结
    php面试中的经典问题
    php 依赖注入的实现
    10分钟快速理解依赖注入
    PHP 依赖注入,依赖反转 (IOC-DI)
    PHP控制反转(IOC)和依赖注入(DI)
  • 原文地址:https://www.cnblogs.com/handsomecui/p/4918918.html
Copyright © 2011-2022 走看看