您的位置:首页 > 编程语言 > C语言/C++

2015年ALPC暑期专题练习I (计算几何) J Kadj Squares

2015-07-22 12:32 344 查看
先求出矩形放置后与x轴的交点横坐标,再找到左边矩形最右端的横坐标和右边矩形最左边的横坐标,注意初始化。

一直WR的代码修改到AC真是不容易,submit十多次。

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<string>
#include<map>
#include<set>
#include<algorithm>
#include<vector>
#include<sstream>
#include<cmath>
using namespace std;
/**********************************************************/
const int MAX_NUM = 100;
/**********************************************************/
int min_2 (int x,int y) {return x<y?x:y;}
int max_2 (int x,int y) {return x>y?x:y;}
int sideLength[MAX_NUM],squareDown[MAX_NUM];
/**********************************************************/
int main()
{
freopen ("in.txt","r",stdin);
int n;
while (scanf ("%d",&n)&&n)
{
for (int i=0;i<n;i++)
scanf ("%d",&sideLength[i]);
//所有边长扩大根号2倍
squareDown[0]=sideLength[0];
for (int i=1;i<n;i++){
int nowCoord=0;
for (int j=0;j<i;j++){
nowCoord = max_2 (nowCoord,squareDown[j]+sideLength[j]-abs(sideLength[i]-sideLength[j])+sideLength[i]);
/*if (sideLength[i]>sideLength[j])
nowCoord = max_2(nowCoord,squareDown[j]+2*sideLength[j]);
else nowCoord = max_2(nowCoord,squareDown[j]+2*sideLength[i]);*/
}
squareDown[i]=nowCoord;
}
/*
for (int i = 0; i < n; i++){
printf ("-%d\n",squareDown[i],sideLength[i]);
}
prinf ("\n");
*/
vector<int> pt;
int x1,x2;
for (int i=0;i<n;i++){
x1=squareDown[i]-sideLength[i];
x2=squareDown[i]+sideLength[i];
for (int j=0;j<i;j++)
if (sideLength[j]>sideLength[i])
x1=max_2(x1,squareDown[j]+sideLength[j]);
for (int j=i+1;j<n;j++)
if (sideLength[j]>sideLength[i])
x2=min_2(x2,squareDown[j]-sideLength[j]);
if (x1<x2){
pt.push_back (i+1);
//printf ("%d-%d %d\n",i+1,x1,x2);
}
}
int len=pt.size ();
for (int i=0; i<len; i++){
printf ("%d",pt[i]);
if (i<len-1)
printf (" ");
else printf ("\n");
}
//printf ("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  计算几何 c++ ACM