最大间距

问题描述:给定n个实数x1,x2,...,xn,求这n(n>=2)个实数在实轴上相邻2个数之间的最大差值,要求设计线性的时间算法

#include <stdio.h>
#include <stdlib.h>

void MaxGap(int n,double *num){
	int i,index;
	double *low = (double *)malloc(sizeof(double)*n); //每个鸽舍的最小数据
	double *high = (double *)malloc(sizeof(double)*n); //每个鸽舍的最大数据 
	int *flag = (int *)malloc(sizeof(int)*n); //标记鸽舍是否为空 
	double avr_gap,minx,maxx,max_gap;
	//确定间距 
	minx = maxx = num[0];
	for(i=1;i<n;i++){
		if(num[i] < minx)
			minx = num[i];
		if(num[i] > maxx)
			maxx = num[i];
	}
	avr_gap = (maxx - minx)/(n-1);
	if(minx == maxx)
		printf("0\n");
	else if(n == 2){
		printf("%lf\n",maxx - minx);
	}
	else{
		//入鸽,只确定最大和最小值
		//memset(flag,0,sizeof(flag));//用memset对malloc开辟的数组 初始化只能修改flag[0]的值 
		for(i=0;i<n;i++){//注意:首先初始化
			low[i] = maxx;
			high[i] = minx;
			flag[i] = 0;
		}
		//将除minx和maxx之外的(n-2)个数放在(n-1)个鸽舍中, 
		//由抽屉原理可知至少有一个鸽舍是空的,又因为每个鸽舍大小相同,所以最大间隙不会在同一个鸽舍中出现,
		//一定是某个鸽舍的上界和其后某个鸽舍的下界之差 
		//而将minx和maxx放入鸽舍(0鸽舍和(n-1)鸽舍)仍然有这个结论 
		for(i=0;i<n;i++){ 
		 	index = (int)((num[i]-minx)/avr_gap);//鸽舍左闭右开(除最后一个鸽舍)
		 	if(!flag[index])
				flag[index] = 1;
		 	if(low[index] > num[i])
		 		low[index] = num[i];
		 	if(high[index] < num[i])
		 		high[index] = num[i];
		}
		//MaxGap = max(Minj-Maxi)
		for(i=1;i<n;i++)
			if(flag[i])
				break;
		max_gap = low[i] - high[0];
		index = i;
		for(++i;i<n;i++){
			if(flag[i]){
				if(low[i] - high[index] > max_gap)
					max_gap = low[i] - high[index];				
				index = i;
			}
		}	
		printf("%lf\n",max_gap);
	}
}
int main(){
	int n,i;
	double *num;
	printf("n:");
	scanf("%d",&n);
	num = (double *)malloc(sizeof(double)*n); 
	for(i=0;i<n;i++)
		scanf("%lf",&num[i]);
	//用鸽舍法求最大间隙问题(用n-2个等间距点分割区间[minx,maxx],产生n-1个段)
	MaxGap(n,num);
	return 0;
}

样例:
5
2.3 3.1 7.5 1.5 6.3---->3.2
5
2.3 3.1 10.0 1.5 6.3---->3.7
10
2.5 7.2 6.3 4.9 10.6 5.3 4.8 3.0 10.5 5.7
排序:2.5 3.0 4.8 4.9 5.3 5.7 6.3 7.2 10.5 10.6 3.3----->3.3

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要动态实现Vue2 UI Li的最小间距为10px,最大间距为32px,你可以使用计算属性和绑定class的方式来实现。具体步骤如下: 1. 在data中定义一个变量,比如叫做spacing,用来存储当前li的间距大小。 2. 在computed中定义一个计算属性,比如叫做liClass,用来动态计算li元素的class属性。 liClass的计算方法如下: ``` liClass() { return this.spacing >= 10 && this.spacing <= 32 ? `li-${this.spacing}` : 'li-10'; } ``` 这个计算属性会根据当前的spacing的大小动态地计算出li元素的class属性。如果spacing值在10到32之间,则返回"li-spacing"的class名,否则返回"li-10"的class名。 3. 在模板中绑定li元素的class属性,并将liClass计算属性绑定到class属性上: ``` <template> <div> <ul> <li :class="liClass">Item 1</li> <li :class="liClass">Item 2</li> <li :class="liClass">Item 3</li> ... </ul> </div> </template> ``` 这样就可以根据spacing的值动态地给li元素设置不同的class名了,从而实现最小间距10px,最大间距32px的效果。 4. 最后,你需要在需要改变spacing的时候,动态地修改它的值。这可以通过事件或者其他方式来触发,例如: ``` methods: { increaseSpacing() { if (this.spacing < 32) { this.spacing += 2; } }, decreaseSpacing() { if (this.spacing > 10) { this.spacing -= 2; } }, } ``` 这样,你就可以通过调用increaseSpacing或者decreaseSpacing方法来动态地改变spacing的值了。在spacing的值改变后,计算属性会重新计算li元素的class属性,并且li元素的间距也会随之改变。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值