找连续数HDU5247

    xiaoxiao2025-10-23  4

    找连续数 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1429 Accepted Submission(s): 527 Problem Description 小度熊拿到了一个无序的数组,对于这个数组,小度熊想知道是否能找到一个k 的区间,里面的 k 个数字排完序后是连续的。 现在小度熊增加题目难度,他不想知道是否有这样的 k 的区间,而是想知道有几个这样的 k 的区间。 Input 输入包含一组测试数据。 第一行包含两个整数n,m,n代表数组中有多少个数字,m 代表针对于此数组的询问次数,n不会超过10的4次方,m 不会超过1000。第二行包含n个正整数,第 I 个数字代表无序数组的第 I 位上的数字,数字大小不会超过2的31次方。接下来 m 行,每行一个正整数 k,含义详见题目描述,k 的大小不会超过1000。 Output 第一行输"Case #i:"。(由于只有一组样例,只输出”Case #1:”即可) 然后对于每个询问的 k,输出一行包含一个整数,代表数组中满足条件的 k 的大小的区间的数量。 Sample Input 6 2 3 2 1 4 3 5 3 4 Sample Output Case #1: 2 2

    一看就知道是一个卡时间的题 想了好久 最后看了大牛的思路果然牛 就是打一个表把所有的情况存起来就好了

    #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #include <queue> #include <stack> using namespace std; int n; int m; int a[10010]; int k[10010]; int vis[100010]; int main(){ while(scanf("%d %d",&n,&m)!=EOF){ for(int i=1;i<=n;i++) scanf("%d",&a[i]); printf("Case #1:\n"); memset(k,0,sizeof(k)); int minn=0; int maxx=0; for(int i=1;i<=n;i++){ memset(vis,0,sizeof(vis)); minn=a[i]; maxx=a[i]; for(int j=i;j<=n;j++){//直接跑肯定超时所以打表吧 maxx=max(maxx,a[j]); minn=min(minn,a[j]); int K=maxx-minn+1; if(!vis[a[j]]){ //防止重复出现 if(K==j-i+1) k[K]++; vis[a[j]]=1; } else break; } } int K; for(int i=1;i<=m;i++){ scanf("%d",&K); printf("%d\n",k[K]); } } return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-1303421.html
    最新回复(0)