1.关于二维数组存放两类数据qsort:
array[][0]存放一类,array[][1]存放另一类
然后qsort(array,n,sizeof(array[0]),cmp);
int cmp(int *a,int *b){
return a[1]-b[1];
}
2.[USACO5.1]圈奶牛Fencing the Cows(P2742)
凸包模板:
#include <bits/stdc++.h>
using namespace std;
struct dot{
double x,y;
}a[100005],s[100005];
double check(dot a1,dot a2,dot b1,dot b2){
return (a2.x-a1.x)*(b2.y-b1.y)-(b2.x-b1.x)*(a2.y-a1.y);
}
double d(dot m,dot n){
return sqrt((n.y-m.y)*(n.y-m.y)+(n.x-m.x)*(n.x-m.x));
}
bool cmp(dot m,dot n){
double tem=check(a[1],m,a[1],n);
if(tem>0) return 1;
else if(tem==0&&d(a[1],m)<d(a[1],n)) return 1;
else return 0;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int n;
double tem;
cin >> n;
for(int i=1;i<=n;i++){
cin >> a[i].x >> a[i].y;
if(i!=1&&a[i].y<a[1].y){
tem=a[i].x;a[i].x=a[1].x;a[1].x=tem;
tem=a[i].y;a[i].y=a[1].y;a[1].y=tem;
}
else if(i!=1&&a[i].y==a[1].y&&a[i].x<a[1].x){
tem=a[i].x;a[i].x=a[1].x;a[1].x=tem;
tem=a[i].y;a[i].y=a[1].y;a[1].y=tem;
}
}
sort(a+2,a+n+1,cmp);
s[1]=a[1];
int st=1;
for(int i=2;i<=n;i++){
while (st>1&&check(s[st-1],s[st],s[st],a[i])<=0) st--;
s[++st]=a[i];
}
s[st+1]=a[1];
double ans=0;
for(int i=1;i<=st;i++){
ans+=d(s[i],s[i+1]);
}
printf("%.2f",ans);
return 0;
}