2016-广场舞

LQ市的市民广场是一个多边形,广场上铺满了大理石的地板砖。

地板砖铺得方方正正,就像坐标轴纸一样。
以某四块砖相接的点为原点,地板砖的两条边为两个正方向,一块砖的边长为横纵坐标的单位长度,
则所有横纵坐标都为整数的点都是四块砖的交点(如果在广场内)。

广场的砖单调无趣,却给跳广场舞的市民们提供了绝佳的参照物。每天傍晚,都会有大批市民前来跳舞。
舞者每次都会选一块完整的砖来跳舞,两个人不会选择同一块砖,如果一块砖在广场边上导致缺角或者边不完整,则没人会选这块砖。
(广场形状的例子参考【图1.png】)

现在,告诉你广场的形状,请帮LQ市的市长计算一下,同一时刻最多有多少市民可以在广场跳舞。

【输入格式】
输入的第一行包含一个整数n,表示广场是n边形的(因此有n个顶点)。
接下来n行,每行两个整数,依次表示n边形每个顶点的坐标(也就是说广场边缘拐弯的地方都在砖的顶角上。数据保证广场是一个简单多边形。

【输出格式】
输出一个整数,表示最多有多少市民可以在广场跳舞。

【样例输入】
5
3 3
6 4
4 1
1 -1
0 4

【样例输出】
7

【样例说明】
广场如图1.png所示,一共有7块完整的地板砖,因此最多能有7位市民一起跳舞。

【数据规模与约定】
对于30%的数据,n不超过100,横纵坐标的绝对值均不超过100。
对于50%的数据,n不超过1000,横纵坐标的绝对值均不超过1000。
对于100%的数据,n不超过1000,横纵坐标的绝对值均不超过100000000(一亿)。

第七届蓝桥杯决赛B组第5题

#include
#include
#include
#include
#include
#include
#define MAX_N 1010
using namespace std;
struct point { int x,y; };
struct line  { point a,b; };
struct ls_node { int index; double y; };
int N;
point P[MAX_N];
line L[MAX_N];
ls_node BUF[MAX_N];
bool cmp(ls_node a,ls_node b){
    return a.yint updb(double a){
    int s=(int)a;
    if(a-s>0.00001)
        s++;
    return s;
}
int lowdb(double a){
    return (int)a;  
}
double fline(line l,double x){
    double len=fabs(l.a.x-l.b.x);
    double xlen=fabs(x-l.a.x);
    double y=(l.b.y-l.a.y)*xlen/len+l.a.y;
    return y;
}
void solve(){
    int minx=P[0].x,maxx=P[0].x;
    for(int i=1;iif(P[i].x>maxx)
            maxx=P[i].x;
        if(P[i].xint ans=0;
    for(int i=minx+1;i<=maxx;i++){
        int count=0;
        for(int j=0;jint ax=L[j].a.x,bx=L[j].b.x;
            if(ax<=i-1&&bx>=i||bx<=i-1&&ax>=i){
                BUF[count].index=j;
                BUF[count].y=fline(L[j],(i+i-1)/2.0);
                count++;    
            }
        }
        sort(BUF,BUF+count,cmp);
        for(int c=0;c2;c++){
            line upline=L[BUF[c*2].index],lowline=L[BUF[c*2+1].index];
            int up=max(updb(fline(upline,i-1)),updb(fline(upline,i)));
            int low=min(lowdb(fline(lowline,i-1)),lowdb(fline(lowline,i)));
            if(low-up>0)
                ans+=low-up;
        }
    }
    cout<int main(){
    cin>>N; 
    for(int i=0;icin>>P[i].x>>P[i].y;
    L[0].a=P[0];
    L[0].b=P[N-1];
    for(int i=1;i1];  
    }
    solve();
}
/*
10
1 6
2 5
4 5
5 3
4 0
1 1
0 2
2 3
0 4
0 5
*****
11
*/ 

/*
5 
3 3 
6 4 
4 1 
1 -1 
0 4
*****
7
*/

你可能感兴趣的:(2016-广场舞)