poj 3347 Kadj Squares 扩大数据化整数

http://poj.org/problem?id=3347

边长不等的正方形,互不相交的摆放在x轴上,且边长与x轴y轴成45度角。(具体可以看题目图例)

要注意正方形的顶点不能越过y轴。

很麻烦的一道几何道,必须要对边长扩大sqrt(2)倍化整数,来避免精度问题。

求每个正方形在x轴上的区间:若正方形i与正方形i-1相邻,则可直接计算出正方形i的顶点位置x。不相邻的话就要依次让正方形i与0~i-1的正方形相邻求出相应的顶点位置x,取最大值。

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
using namespace std;
struct it
{
 int a,b,len;
 int num;
}q[55];
bool cmp(it a,it b)
{
 return a.a<b.a;
}
int main()
{
 int n,i,j,k,x[55],ans[55],max,flag;
 while(scanf("%d",&n),n)
 {
  for(i=0;i<n;i++)
     {
   scanf("%d",&q[i].len);
   if(i==0)
    x[i]=q[i].len;
   else if(q[i].len<=q[i-1].len)
    x[i]=x[i-1]+2*q[i].len;
   else if(q[i].len<=2*q[i-1].len)
    x[i]=x[i-1]+2*q[i-1].len;
   else
   {
    x[i]=-1;
    for(j=0;j<i;j++)
    {
     if(q[i].len<=q[j].len)
         max=x[j]+2*q[i].len;
     else
      max=x[j]+2*q[j].len;
     if(x[i]<max)
      x[i]=max;
    }
   }
   q[i].a=x[i]-q[i].len;
   q[i].b=x[i]+q[i].len;
   if(q[i].a<0)
   {
    q[i].a=0;
    q[i].b=2*q[i].len;
    x[i]=q[i].len;
   }
   q[i].num=i+1;
     }
     sort(q,q+n,cmp);
     k=0;
     for(i=0;i<n;i++)
     {
    max=q[i].a;flag=0;
       for(j=0;j<i;j++)
       {
    if(q[j].b>=q[i].b)
    {
     flag=1;
     break;
    }
    if(q[j].len>q[i].len&&q[j].b>=max)
    max=q[j].b;
   }
    if(!flag)
    for(j=i+1;j<n;j++)
    {
     if(q[j].a<=max&&q[j].len>q[i].len)
     {
      flag=1;
      break;
     }
   }
   if(!flag)
    ans[k++]=q[i].num;
  }
  sort(ans,ans+k);
  printf("%d",ans[0]);
  for(i=1;i<k;i++)
  printf(" %d",ans[i]);
  printf("\n");
 }
 return 0;
}

posted @ 2011-05-04 15:23  CoderZhuang  阅读(179)  评论(0编辑  收藏  举报