b.
#include <stdio.h>
#include <stdlib.h>
#include <float.h>
void merge(float a[],int p,int q,int r)
{
int l=r-p+1,l1=q-p+1,l2=r-q,i,j,k;
float *t1=(float*)malloc((l1+1)*sizeof(float));
float *t2=(float*)malloc((l2+1)*sizeof(float));
for(i=0;i<l1;i++)
{
t1[i]=a[p+i];
}
t1[i]=DBL_MAX;
for(j=0;j<l2;j++)
{
t2[j]=a[q+j+1];
}
t2[j]=DBL_MAX;
i=j=0;
for(k=0;k<l;k++)
{
if(t1[i]<=t2[j])
a[k+p]=t1[i++];
else
a[k+p]=t2[j++];
}
free(t1);
free(t2);
}
void mergeSort(float a[],int p,int r)
{
if(p>=r)
return;
int q=(p+r)/2;
mergeSort(a,p,q);
mergeSort(a,q+1,r);
merge(a,p,q,r);
}
void printA(float a[],int len)
{
for(int i=0;i<len;i++)
{
printf("%.2f ",a[i]);
}
printf("\n");
}
int getWMid(float a[],int len)
{
float sum=0.0;
int i;
for(i=0;i<len;i++)
{
sum+=a[i];
if(sum>=0.5)
break;
}
return i;
}
void main()
{
float a[7]={0.1,0.35,0.05,0.1,0.15,0.05,0.2};
mergeSort(a,0,6);
printA(a,7);
int k=getWMid(a,7);
printf("%.2f ",a[k]);
getchar();
}
c.
void swop(float* a,float* b)
{
float temp=*a;
*a=*b;
*b=temp;
}
int partition(float a[],int p,int r)
{
int i=p-1,j;
float x=a[r];
for(j=p;j<r;j++)
{
if(a[j]<x)
{
i++;
swop(&a[j],&a[i]);
}
}
swop(&a[r],&a[i+1]);
return i+1;
}
float at(float a[],int p,int r,float w)
{
if(p>=r)
return a[p];
int q=partition(a,p,r);
float sum=0.0;
for(int i=p;i<q;i++)
sum+=a[i];
if(sum<w && sum+a[q]>w)
return a[q];
else if(sum>w)
return at(a,p,q-1,w);
else
return at(a,q,r,w-sum);
}
d. 与距离无关,只与权重有关。
e. 对x和y各执行一遍c,相应的点就是答案了