📄 1.cpp
字号:
#include<stdio.h>
#include<math.h>
#define M 10000
double x[M],y[M],r[M],w[M],d[M];
void choosePostion(int n,double k,double m);
void main(){
int i,j,n;
int c;
double k,min;
printf("输入需要满足的商户总数: ");
scanf("%d",&n);
while(n==0){
printf("没有商户,无需设备!\n");
printf("请重新输入需要满足的商户总数: ");
scanf("%d",&n);
}
printf("输入各商户的坐标(x,y),需求量,运费:\n");
for(i=0;i<n;i++){
printf("第%d个:坐标:",i+1);
scanf("%lf,%lf",&x[i],&y[i]);
printf("需求量:");
scanf("%lf",&r[i]);
printf("运费:");
scanf("%lf",&w[i]);
}
printf("请选择您要的操作:1=求最佳地址;2=增加商户;3=修改商户;4=显示商户信息;5=退出\n");
scanf("%d",&c);
while(c!=5){
switch(c){
case 1:
printf("请给出确定的转换因子k:");
scanf("%lf",&k);
printf("请给出收敛的差值min:");
scanf("%lf",&min);
choosePostion(i,k,min);
break;
case 2:
printf("新增加第%d个:坐标:",i+1);
scanf("%lf,%lf",&x[i],&y[i]);
printf("需求量:");
scanf("%lf",&r[i]);
printf("运费:");
scanf("%lf",&w[i]);
i++;
break;
case 3:
printf("输入需要更改的商户编号:");
scanf("%d",&j);
printf("请重新输入第%d个:坐标:",j);
j--;
scanf("%lf %lf",&x[j],&y[j]);
printf("需求量:");
scanf("%lf",&r[j]);
printf("运费:");
scanf("%lf",&w[j]);
break;
case 4:
printf("所有商户的信息如下:\n");
for(j=0;j<i;j++){
printf("第%d个商户:坐标:x=%lf,y=%lf\t",j+1,x[j],y[j]);
printf("需求量:%lf\t",r[j]);
printf("运费:%lf\n",w[j]);
}
break;
default:
break;
}
printf("请选择您要的操作:1=求最佳地址;2=增加商户;3=修改商户;4=显示商户信息;5=退出\n");
scanf("%d",&c);
}
}
double sum1(int n,double a[M],double b[M],double c[M]){
int i;
double s=0,p=0;
for(i=0;i<n;i++)
s+=a[i]*b[i]*c[i];
for(i=0;i<n;i++)
p+=b[i]*c[i];
return s/p;
}
double sum2(int n,double a[M],double b[M],double c[M]){
int i;
double s=0,p=0;
for(i=0;i<n;i++)
s+=a[i]*b[i]*c[i]/d[i];
for(i=0;i<n;i++)
p+=b[i]*c[i]/d[i];
return s/p;
}
double comp(double a,double b){
if(a<0)
return (-a-b);
return (a-b);
}
void choosePostion(int n,double k,double m){
int i=1,j;
bool find=false;
double sum,a1,b1,a2,b2;
if(n==1){
printf("对于一个商户,新设备的最佳选址即商户所在地址: x=%lf,y=%lf\n",x[0],y[0]);
printf("当前总花费为0.\n");
}
else{
a1=sum1(n,x,r,w);
b1=sum1(n,y,r,w);
while(find==false){
printf("a[%d]=%lf,b[%d]=%lf\n",i,a1,i,b1);
printf("现有设施与新设施的距离d[i]: \n");
for(j=0;j<n;j++){
d[j]=(sqrt)((x[j]-a1)*(x[j]-a1)+(y[j]-b1)*(y[j]-b1));
d[j]*=k;
printf("d[%d]:%lf\t",j+1,d[j]);
}
sum=0;
for(j=0;j<n;j++){
sum+=d[j]*r[j]*w[j];
}
printf("当前总花费为%lf.\n",sum);
a2=sum2(n,x,r,w);
b2=sum2(n,y,r,w);
if((comp(a1-a2,m)<0)&&(comp(b1-b2,m)<0))
find=true;
a1=a2;
b1=b2;
i++;
}
printf("a[%d]=%lf,b[%d]=%lf\n",i,a1,i,b1);
printf("所以,新设备的最佳选址为: x=%lf,y=%lf\n",a2,b2);
sum=0;
for(j=0;j<n;j++){
sum+=d[j]*r[j]*w[j];
}
printf("最小总花费为%lf.\n",sum);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -