// Brute-force solution of picking up k objects on a line // 3/28/05 BPW #define MAX (20) int inArray[MAX]; double mid[MAX*MAX]; #include int intCompare(const void* xin, const void* yin) { int *x,*y; x=(int*) xin; y=(int*) yin; return (*x) - (*y); } int doubleCompare(const void* xin, const void* yin) { double *x,*y; double z; x=(double*) xin; y=(double*) yin; z=(*x) - (*y); if (z==0.0) return 0; if (z<0.0) return -1; if (z>0.0) return 1; } // These map coordinates to 0 ... 530 #define TRANSX(X) (530.0*((X)-xmin)/xdiff) #define TRANSY(Y) (530.0*((Y)-ymin)/ydiff) main() { int n,k,i,j; int nmid; int left,right,count; double sum; double xdiff,ydiff; double xmin,xmax,ymin,ymax,y; scanf("%d %d",&n,&k); inArray[0]=(-9999999);//sentinel for (i=1;i<=n;i++) scanf("%d",&inArray[i]); qsort(&inArray[1],n,sizeof(int),intCompare); // Eliminate duplicates j=1; for (i=2;i<=n;i++) if (inArray[i]>inArray[j-1]) inArray[++j]=inArray[i]; n=j; inArray[n+1]=9999999;//sentinel xmin=inArray[1]; xmax=inArray[n]; xdiff=xmax-xmin; ymin=0.0; // See O'Rourke, p. 206 ymin=9999999; ymax=(-9999999); for (i=1;i<=n;i++) { y=2*inArray[i]*xmin-inArray[i]*inArray[i]; if (yymax) ymax=y; y=2*inArray[i]*xmax-inArray[i]*inArray[i]; if (yymax) ymax=y; } ydiff=ymax-ymin; nmid=0; for (i=1;imid[j-1]) mid[j++]=mid[i]; nmid=j; printf("%%!PS\n"); printf("%%%%BoundingBox: 0 0 605 755\n"); /* The +72 shifts the figure one inch from the lower left corner */ printf("40 155 translate\n"); printf("0.5 setlinewidth\n"); for (i=1;i<=n;i++) { printf("newpath\n"); printf("%f %f moveto\n",TRANSX(xmin), TRANSY(2*inArray[i]*xmin-inArray[i]*inArray[i])); printf("%f %f lineto\n",TRANSX(xmax), TRANSY(2*inArray[i]*xmax-inArray[i]*inArray[i])); printf("stroke\n"); } left=0; for (i=0;i