给你一些四十五度角放在二维坐标系中的正方形的边长,求从上面可以看见序号为几的正方形;
这题一开始我的想法是向量旋转,过程很猥琐复杂 = = 看了kuangbin的题解,啊~~如此简单粗暴学起来学起来。
cos(45) = sqrt(2)/ 2 那么默认每个数都扩大sqrt(2)倍,输入数据的时候做一下处理,算出每个正方形的最左边和最后变点的X值
处理完后再扫描一次,看当前正方形有没有被其他的正方形覆盖
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int M = 55;
struct pnode
{
int len,lft,rit;
};
pnode square[M];
#define FONE(i,n) for(int i= 1;i<=n;++i)
int main()
{
int num;
while( scanf("%d",&num) && num)
{
FONE(i,num)
{
scanf("%d",&square[i].len);
square[i].lft = 0;
for( int j =1;j <i;++j)
square[i].lft = max(square[i].lft,
square[j].rit - abs(square[i].len-square[j].len) );
square[i].rit = square[i].lft + 2 * square[i].len;
}
FONE(i,num)
{
for( int j=1;j<i;++j)
if( square[j].rit > square[i].lft && square[i].len < square[j].len)
square[i].lft = square[j].rit;
for( int j = i+1;j<=num;++j)
if( square[j].lft < square[i].rit && square[i].len < square[j].len)
square[i].rit = square[j].lft;
}
int f = 1;
FONE(i,num)
{
if( square[i].lft < square[i].rit)
{
if( f )f = 0;
else printf(" ");
printf("%d",i);
}
}
puts("");
}
return 0;
}