题目链接:http://lightoj.com/volume_showproblem.php?problem=1100
题意是给你n个数,q个询问,每次求出 a 到 b(从0开始)最小差值;
直接暴力就能过:
#include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> #include<iostream> using namespace std; #define N 1010 #define INF 0xfffffff int num[N*100], cnt[N], vis[N]; int main() { int T, t=1, n, a, b, q; scanf("%d", &T); while(T--) { scanf("%d%d", &n, &q); for(int i=0; i<n; i++) scanf("%d", &num[i]); printf("Case %d: ", t++); while(q--) { memset(vis, 0, sizeof(vis)); scanf("%d%d", &a, &b); int flag = 0, Min = INF; for(int i=a; i<=b; i++) { if(vis[num[i]]==1) { flag=1; break; } else { for(int j=a; j<i; j++) Min = min(Min, abs(num[i]-num[j])); vis[num[i]] = 1; } } if(flag == 1) Min = 0; printf("%d ", Min); } } return 0; }
#include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> #include<iostream> using namespace std; #define N 1010 #define INF 0xfffffff int num[N*100], cnt[N]; int main() { int T, t=1, n, a, b, q; scanf("%d", &T); while(T--) { scanf("%d%d", &n, &q); for(int i=0; i<n; i++) scanf("%d", &num[i]); printf("Case %d: ", t++); while(q--) { memset(cnt, 0, sizeof(cnt)); scanf("%d%d", &a, &b); int flag = 0, Min = INF, pre = 0; for(int i=a; i<=b; i++) cnt[num[i]]++; for(int i=1; i<=1000; i++) { if(flag == 1)break; if(cnt[i]>=2) { flag = 1;break; } if(cnt[i]==1) { if(pre == 0) pre = i; else { Min = min(Min, i-pre); if(Min == 0)flag = 1; pre = i; } } } if(flag == 1) Min = 0; printf("%d ", Min); } } return 0; }