ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ZJNU 1365 - Window--中级

2020-01-26 22:57:04  阅读:281  来源: 互联网

标签:tmp 1000010 int max lmax Window 1365 答案 ZJNU


每次都寻找长度为k的区间内的最小值显然很容易超出时间限制

所以可以把窗户看作一个数量固定的队列

每次观察入列与出列的元素对答案贡献如何,以更新答案

 1 /*
 2 Written By StelaYuri
 3 */
 4 #include<stdio.h>
 5 int tmp[1000010],max[1000010];
 6 int gmax(int i,int k)
 7 {
 8     int j,m=tmp[i];
 9     for(j=i-1;j>i-k;j--)
10         if(m<tmp[j])
11             m=tmp[j];
12     return m;
13 }
14 int gmin(int i,int k)
15 {
16     int j,m=tmp[i];
17     for(j=i-1;j>i-k;j--)
18         if(m>tmp[j])
19             m=tmp[j];
20     return m;
21 }
22 int main()
23 {
24     int n,k,i,lmin,lmax;
25     scanf("%d%d",&n,&k);
26     for(i=0;i<k;i++)
27         scanf("%d",&tmp[i]);
28     lmin=gmin(k-1,k);
29     lmax=gmax(k-1,k);
30     printf("%d",lmin);
31     max[0]=lmax;
32     for(;i<n;i++)
33     {
34         scanf("%d",&tmp[i]);
35         if(tmp[i-k]==lmin)//如果即将移出的数字与前一位置的答案相同,说明答案需要重新查找
36             lmin=gmin(i,k);
37         else if(tmp[i]<lmin)//如果即将移入的数字比前面的答案小,更新答案为当前位置输入的答案
38             lmin=tmp[i];
39         printf(" %d",lmin);
40         if(tmp[i-k]==lmax)
41             lmax=gmax(i,k);
42         else if(tmp[i]>lmax)
43             lmax=tmp[i];
44         max[i+1-k]=lmax;
45     }
46     printf("\n%d",max[0]);
47     for(i=1;i<n-k+1;i++)
48         printf(" %d",max[i]);
49     
50     return 0;
51 }

 

标签:tmp,1000010,int,max,lmax,Window,1365,答案,ZJNU
来源: https://www.cnblogs.com/stelayuri/p/12234995.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有