大佬帮忙看看吧、、觉得思路没问题,只过了sub1
查看原帖
大佬帮忙看看吧、、觉得思路没问题,只过了sub1
692458
z21371173楼主2022/3/21 17:39
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
int min(int a[],int i,int b);//前i个元素中找到距离当前值b最近的值,注意i是下标,可取 
int cmp(const void *a,const void *b);
int search(int a[],int c,int b);//找到最近的点 
int find(int a,int b,int c);//三者找最小 
int temp[33300];
int main(){
	int n;
	scanf("%d",&n);
	int res=0;
	int big[33300];//村数值 
	for(int i=0;i<n;i++){
		scanf("%d",&big[i]);
		if(i==0){
			res+=big[i];//这里说是直接加营业额,万一是负的呢
			//???????????????一号 
			continue;
		}
		else if(i==1){
			res+=abs(big[i]-big[0]);
		}
		else{
			res+=min(big,i-1,big[i]);
		}
	}
	printf("%d",res) ;
}
int find(int a,int b,int c){
	int min;
	min=a;
	if(min>b)
	min=b;
	if(min>c)
	min=c;
	return min;
}
int min(int a[],int c,int b){//c is include
	int res;
	memcpy(temp,a,(c+1)*sizeof(int));//给到temp
	qsort(temp,c+1,sizeof(temp[0]),cmp);//排序 
	int d;//reserve position of nearest 
	if(b<=0){
		return abs(temp[0]-b);
	}
	else{
		if(temp[c]<=b)
		return abs(temp[c]-b);
		d=search(temp,c,b);
		if(d==0){
			return abs(temp[0]-b)<=abs(temp[1]-b)?abs(temp[0]-b):abs(temp[1]-b);
		}
		else if(d==c){
			return abs(temp[c]-b)<=abs(temp[c-1]-b)?abs(temp[c]-b):abs(temp[c-1]-b);
		}
		else{
			return find(abs(temp[d]-b),abs(temp[d-1]-b),abs(temp[d+1]-b));
		}
	}
}
int search(int a[],int c,int x){//find距离x最近的点 ,c is included
	int low=0,high=c,mid;
	mid=c/2;
	if(a[mid]==x)
	return mid;
	int flag=mid;
	int kk=0; 
	while(a[mid]!=x){//find mid
		if(a[mid]<x){
			low=mid;
			mid=(low+high)/2;
		}
		else if(a[mid]>x){
			high=mid;
			mid=(low+high)/2;
		}
		else{
			return mid;
		} 
		if(flag!=mid) 
		flag=mid;
		else{//因为有可能找不到,所以一旦连续mid都是同一个数,那么就要考虑退出循环了 
			kk++;
			if(kk==2)
			return mid;
		}
	}
}
int cmp(const void *a,const void *b){
	int *p1=(int *)a;
	int *p2=(int *)b;
	return *p1-*p2;
}
2022/3/21 17:39
加载中...