color convex_hull
来源:互联网 发布:系统修复软件 win10 编辑:程序博客网 时间:2024/06/10 04:25
#include <stdlib.h>#include <string.h>#include <stdio.h>#include <iostream>#include <cstring>#include <cstdio>#define N 100000using namespace std;int numcolor = 0,numpoint = 0;long long int d[2*N],bot,top;int temp;char a[100][1000];typedef struct POINT{long long int x,y,index;}POINT;POINT point[100][N];POINT point2[100][N];long long int ccw(POINT p1,POINT p2,POINT p3){ long long ans; ans = (p2.x-p1.x)*(p3.y-p1.y)-(p2.y-p1.y)*(p3.x-p1.x); return ans;}int cmp(const void *a,const void *b){ POINT *c = (POINT*) a; POINT *d = (POINT*) b; if(c->x!=d->x) return c->x-d->x; else return c->y-d->y;}long long int cal(POINT a,POINT b,POINT c){ return (a.x*(c.y-b.y)+b.x*(a.y-c.y)+c.x*(b.y-a.y));}long long int area(int a){ long long sum = 0; for(int i=0;i<a-2;i++) sum = sum + cal(point[0][0],point[0][i+1],point[0][i+2]);if(sum<0) sum = 0-sum;return sum;}void convex_hull_single(int npoints, int col){ int i, t, k = 0; /* lower hull */ for (i = 0; i < npoints; ++i) { while (k >= 2 && ccw(point2[col][k-2], point2[col][k-1], point[col][i]) <= 0) --k; point2[col][k++] = point[col][i]; } /* upper hull */ for (i = npoints-2, t = k+1; i >= 0; --i) { while (k >= t && ccw(point2[col][k-2], point2[col][k-1], point[col][i]) <= 0) --k; point2[col][k++] = point[col][i]; } if(k==1) k++; else{ for(int i3 = 0;i3<k;i3++){ point2[col][i3].x = point2[col][i3+1].x; point2[col][i3].y = point2[col][i3+1].y; } } point2[col][0].index = k-2;}void convex_hull_double(int npoints, int col){ int i, t, k = 0; /* lower hull */ for (i = 0; i < npoints; ++i) { while (k >= 2 && ccw(point[0][k-2], point[0][k-1], point2[0][i]) <= 0) --k; point[0][k++] = point2[0][i]; } /* upper hull */ for (i = npoints-2, t = k+1; i >= 0; --i) { while (k >= t && ccw(point[0][k-2], point[0][k-1], point2[0][i]) <= 0) --k; point[0][k++] = point2[0][i]; } //if(k==1) //k++; //else{ //for(int i3 = 0;i3<k;i3++){ //point2[0][i3].x = point2[0][i3+1].x; //point2[0][i3].y = point2[0][i3+1].y; //} //} point2[0][0].index = k-2;}long long int read(){ char b[20]; int flag = 1,X,Y;while(cin>>X!=NULL){ cin>>Y; gets(b); int k =0; for(int i = 1;i<=numcolor;i++){ flag = strcmp(b,a[i]); if (flag==0){ k = i; point[k][0].index++; point[k][point[k][0].index].x=X; point[k][point[k][0].index].y=Y; goto next;}}strcpy(a[numcolor+1],b);point[numcolor+1][0].x=X;point[numcolor+1][0].y=Y;point[numcolor+1][0].index= 0;numcolor++;next:; numpoint++;}return numcolor;}int main(){long long int i,total,j,i1,length;long long int max=0,max1,max2;total=read();//printf("%lld\n",total);//puts(a[0]);//puts(a[1]);//puts(a[2]);//puts(a[3]); //cout<<point[1][0].x<<point[1][0].y<<endl; //cout<<point[1][1].x<<point[1][1].y<<endl; //cout<<point[2][0].x<<point[2][0].y<<endl; //cout<<point[3][0].x<<point[3][0].y<<endl; //cout<<point[1][0].index<<point[1][0].index<<endl; //cout<<point[5][0].x<<point[5][0].y<<point[5][1].x<<point[5][1].y<<endl;if (total==0){return 0;}if (total==1){puts(a[1]);return 0;}//for(int i2 = 1;i2<7;i2++) //cout<<" "<<point[i2][0].index<<" "<<endl; //cout<<point[6][0].x<<point[6][0].y<<point[6][1].x<<point[6][1].y<<endl;for(int i2 = 1;i2<=numcolor;i2++){ temp = point[i2][0].index; qsort(point[i2],temp+1,sizeof(point[i2][0]),cmp); point[i2][0].index =temp; convex_hull_single(point[i2][0].index+1,i2);} //for(int i2 = 1;i2<7;i2++) //cout<<" "<<point2[i2][0].index<<" "<<endl;for (i=1;i<total;i++){for (j=i+1;j<=total;j++){length=point2[i][0].index+point2[j][0].index+2;for (i1=0;i1<=point2[i][0].index;i1++)point2[0][i1]=point2[i][i1];for (i1=point2[i][0].index+1;i1<length;i1++)point2[0][i1]=point2[j][i1-1-point2[i][0].index]; qsort(point2[0],length,sizeof(point[0][0]),cmp); point2[0][0].index = length-1; // cout<<"length shi "<<length<<endl; //for(int i2 = 0;i2<length;i2++) //cout<<"11!!"<<point2[0][i2].x<<" "<<point2[0][i2].y<<endl;convex_hull_double(length,0); //for(int i2 = 0;i2<length;i2++) //cout<<"22!!"<<point2[0][i2].x<<" "<<point2[0][i2].y<<endl;//sort(length); tubao//melkman(length); //cout<<area(length)<<endl;if (area(point2[0][0].index+2)>max){max=area(point2[0][0].index+2);max1=i;max2=j;}}}i=0;//cout<<max<<endl; //cout<<max1<<" "<<max2<<endl;if (strcmp(a[max1],a[max2])>0){max1=max1+max2;max2=max1-max2;max1=max1-max2;}if(max%2 ==0)printf("%lld",max/2);if(max%2==1) printf("%lld.5",max/2);while(a[max1][i]!='\0'){printf("%c",a[max1][i++]);}puts(a[max2]);return 0;}
0 0
- color convex_hull
- color #
- color
- color
- Color
- color
- color
- color
- Color
- Color
- color
- COLOR
- Color
- color
- color
- Color
- color
- color
- javascript中打印当前的时间
- 借记来帐,借记往账,贷记来帐,贷记往账
- 纯C语言写的日历
- javascript页面动态显示时间变化
- 建行网银盾无法识别怎么办
- color convex_hull
- 破窗理论
- javascript中计算两个时间日期间隔的天数
- C语言程序员必读的5本书
- mysql5.0 执行定时计划-Window系统
- 添加动态按钮(UIAlertButton)
- 谷歌15年:盘点助其走向成功的14条秘诀
- Selenium 2.0 WebDriver 使用指南
- springMVC的配置文件