2016-广场舞

来源:互联网 发布:wps表格查找重复数据 编辑:程序博客网 时间:2024/06/10 03:54

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<iostream>#include<algorithm>#include<cstdio>#include<math.h>#include<string>#include<vector>#define MAX_N 1010using 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.y<b.y; }int 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;i<N;i++){        if(P[i].x>maxx)            maxx=P[i].x;        if(P[i].x<minx)            minx=P[i].x;        }    int ans=0;    for(int i=minx+1;i<=maxx;i++){        int count=0;        for(int j=0;j<N;j++){            int 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;c<count/2;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<<ans<<endl;}int main(){    cin>>N;     for(int i=0;i<N;i++)        cin>>P[i].x>>P[i].y;    L[0].a=P[0];    L[0].b=P[N-1];    for(int i=1;i<N;i++){        L[i].a=P[i];        L[i].b=P[i-1];      }    solve();}/*101 62 54 55 34 01 10 22 30 40 5*****11*/ /*5 3 3 6 4 4 1 1 -1 0 4*****7*/
原创粉丝点击