自己想的思路,无st表等高级算法,但是失败了。60分求助
查看原帖
自己想的思路,无st表等高级算法,但是失败了。60分求助
390094
大探险家朵拉楼主2021/8/8 13:43

想法是这样的,既然每次只要求最小值,那么只要比最小值就行;

用min1表示最小值,min2做替补防止min1失效就行; 然后,失败了。 不过感觉很快啊,空间也很小;

代码:

#include <cstdio>
using namespace std;
int n,m,i,min1=10000001,min2=10000001,pl1,pl2,d;
/*min1:当前区间最小的数; 
min2:当前区间min1之后最小的数; 
(min1之前第二小的数无意义,因为比min1更早过时); 
pl1,pl2:分别表示min1和min2的位置; 
d :deadline过时线,在之前的数据已经过时(每次只比较一个m大的区间); 
*/
int q[1000001];
int main(){
	scanf("%d%d",&n,&m);
	for(i=1;i<=m;i++){
		scanf("%d",&q[i]);
		if(q[i]<min1){
			min1=q[i];
			pl1=i;
		}
	}//输入m个数据找到min1,和min1的位置; 
	for(i=pl1+1;i<=m;i++){
		if(q[i]<min2){
			min2=q[i];
			pl2=i;
		}
	}//找到min2和min2的位置; 
	printf("%d\n",min1);//相当于搜了m次,i=m+1,d++; 
	d=2;
	for(i=m+1;i<=n;i++){
		scanf("%d",&q[i]);
		if(pl1<d){//min1过时上min2 
			min1=min2;
			pl1=pl2;
			min2=1000001;
		}
		if(q[i]<=min1){//有比min1更小的,更改min1; 
			min1=q[i];
			pl1=i;
		}
		if(pl1>=pl2)//更改后min1可能在min2后,min2变成废废; 
		min2=1000001;
		if(min1<q[i]<=min2){//有更好的替补(min2) ,更改min2; 
			min2=q[i];
			pl2=i;
		}
		d++;//死线后移; 
		printf("%d\n",min1);//每次输出一次最小; 
	}
}

萌新什么也不懂,来个人救救孩子吧;

2021/8/8 13:43
加载中...