c
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
//贪心算法之货仓选址问题
/**
* void* p是万能指针,可以和其它任意类型的指针进行转换,前提是确保转换是合法的
*/
//写好用于qsort的比较函数,这里写的函数一般用于升序排序
int compare(const void* a, const void* b)
{
//(int*)为先将指针a强制类型转换为整型指针,前面的*为取值操作
return(*(int*)a - *(int*)b);
}
//找出数组排好序后处于中间位置的数
int find(int* shops, int arrNum)//shops为数组名,arrNum为数组的长度
{
qsort(shops,arrNum,sizeof(int),compare); //因为是整型数组,所以第三部分写的是sizeof(int)
int pos = shops[arrNum / 2];
return pos;
}
//求总的距离
int sum(int pos,int* shops, int arrNum)
{
int total = 0;
for (int i = 0; i < arrNum; i++)
{
total += abs(pos - shops[i]);
}
return total;
}
int main(int argc, char* argv[])
{
int n = 0;
printf("请输入商店数量:");
scanf_s("%d",&n);
int* shops = (int*)malloc(sizeof(int) * n);
printf("输入商店坐标\n");
for (int i = 0; i < n; i++)
{
printf("第%d间商店:",i+1);
scanf_s("%d",shops+i);
}
int pos = find(shops, n);
int total = sum(pos, shops, n);
printf("货仓坐标:%d,最短距离:%d\n",pos,total);
return 0;
}