Area of Mushroom HDU

Area of Mushroom

 HDU - 4946

题意:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <cmath>
 6 using namespace std;
 7 
 8 const int maxn=510;
 9 char res[maxn];
10 struct Node{
11     int x,y,v;
12     int vis;
13     int id;
14     Node(){}
15     Node(int x,int y):x(x),y(y){}
16     bool operator < (const Node& a)const {
17        if(v==a.v) return x<a.x||x==a.x&&y<a.y;
18        return v>a.v;
19     }
20     Node operator - (const Node& a){
21         return Node(x-a.x,y-a.y);
22     }
23     bool operator == (Node a){
24         return x==a.x&&y==a.y;
25     }
26 }p[maxn],mv[maxn],convex[maxn];
27 
28 int cross(Node a,Node b){
29     return a.x*b.y-a.y*b.x;
30 }
31 int ConvexHull(int n){
32     int m=0;
33     for(int i=0;i<n;i++){
34         while(m>1&&cross(convex[m-1]-convex[m-2],mv[i]-convex[m-2])<0) m--;
35         convex[m++]=mv[i];
36     }
37     int k=m;
38     for(int i=n-2;i>=0;i--){
39         while(m>k&&cross(convex[m-1]-convex[m-2],mv[i]-convex[m-2])<0) m--;
40         convex[m++]=mv[i];
41     }
42     if(n>1)m--;
43     return m;
44 }
45 int main(){
46     int n,maxv,kase=0;
47     while(scanf("%d",&n)&&n){
48         maxv=0;
49         for(int i=0;i<n;i++) {
50             scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].v);
51             maxv=max(maxv,p[i].v);
52             p[i].vis=0;
53             p[i].id=i;
54             res[i]='0';
55         }
56         res[n]='';
57         if(maxv==0){
58             printf("Case #%d: %s
",++kase,res);
59             continue;
60         }
61         sort(p,p+n);
62         int cnt=0;
63         for(int i=0;i<n;){
64             if(p[i].v!=maxv) break;
65             int r=1;
66             while(i+r<n&&p[i]==p[i+r]) {
67                 if(maxv!=p[i+r].v) break;
68                 r++;
69             }
70             mv[cnt]=p[i];
71             if(r>1) mv[cnt].vis=1; //重点!
72             cnt++;
73             i+=r;
74         }
75         int num=ConvexHull(cnt);
76         for(int i=0;i<num;i++){
77             if(convex[i].vis==0) res[convex[i].id]='1';
78         }
79          printf("Case #%d: %s
",++kase,res);
80     }
81     return 0;
82 }
View Code
原文地址:https://www.cnblogs.com/yijiull/p/7380955.html