poj 1723

来源:互联网 发布:交易平台数据库设计 编辑:程序博客网 时间:2024/06/07 03:56
//士兵排队,最终站成一排,移动步数最少,这道题做的时候,//我也是首先考虑了士兵最终到底站到哪一排才能使移动步数最少,//也想到了,最终选定的那一排肯定是所有士兵的纵坐标的最大值和//最小值之间的某个纵坐标处,但是到底怎样来确定这个位置呢,//就再也没想到了~~~~,还是和做poj 3262的情况一样,数学问题,后来//看看别人的理解,说是将纵坐标从小到大排序,然后求中位数,//可是为什么要求中位数呢,再来看看中位数有什么代表性的意义吧,//说是常用它来描述该组数据的集中趋势,也就是说士兵最终站的那一排//应该是最初士兵比较集中的一排喽!可是每个士兵到达该排的步数又//该怎么算呢,看了别人写的,还是不理解为什么那样求得的就是最优解 #include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>int N,x[10005],y[10005],x1[10005],X,Y,sum; int cmp(const void *a,const void *b){return *(int*)a-*(int*)b;}int main(){ int i; while(scanf("%d",&N)!=EOF) {    sum=0;     for(i=0;i<N;i++)   scanf("%d %d",&x[i],&y[i]);  qsort(x,N,sizeof(x[0]),cmp);  for(i=0;i<N;i++)   x1[i]=x[i]-i;  //for(i=0;i<N;i++)   //printf("%d %d\n",x[i],x1[i]);  //printf("\n");   qsort(x1,N,sizeof(x1[0]),cmp);  X=x1[N/2];  for(i=0;i<N;i++)   sum+=abs(x1[i]-X);  //printf("%d\n",sum);   qsort(y,N,sizeof(y[0]),cmp);   Y=y[N/2];  for(i=0;i<N;i++)   sum+=abs(y[i]-Y);  printf("%d\n",sum); }     system("pause");     return 0;}

0 0
原创粉丝点击