嘟嘟嘟




题意:给出一堆正方形的边长,且这些正方形都是\(45 ^ {\circ}\)斜放着并且紧挨着的,求从上往下看能看到几个正方形。




真是一道好题……跟计算几何关系不大。

想一下,如果我们能求出正方形的所有端点,那么这道题就变成了从上往下看,能看到几条线段了。

对于一个正方形\(s_i\)的左端点\(s_i.l\),我们可以从\(s_j(j < i)\)得到:即假设\(s_i\)和\(s_j\)紧挨着,那么如果\(s_i.len \leqslant s_j.len\),那么\(s_i.l = s_j.l + s_j.len + s_i.len\),否则\(s_i.l = s_j.l + s_j.len * 3 - s_i.len\)。然后\(s_i.l\)就是这些所有运算结果的\(max\)值。最后更新\(s_i.r = s_i.l + s_i.len * 2\)。

讲道理这里面加上的应该是\(s_i.len / \sqrt{2}\)。然而怕掉精度,就都约掉了。

这样就把正方形转化成了线段。然后就是线段覆盖的问题了。一个比较清奇的思路是用别的线段的左右端点坐标修改自己的,如果最后自己的\(s_i.l \geqslant s_i.r\),说明这个线段已经全被挡死了。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
#define enter puts("")
#define space putchar(' ')
#define Mem(a, x) memset(a, x, sizeof(a))
#define rg register
typedef long long ll;
typedef double db;
const int INF = 0x3f3f3f3f;
const db eps = 1e-8;
const int maxn = 55;
inline ll read()
{
ll ans = 0;
char ch = getchar(), last = ' ';
while(!isdigit(ch)) last = ch, ch = getchar();
while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar();
if(last == '-') ans = -ans;
return ans;
}
inline void write(ll x)
{
if(x < 0) x = -x, putchar('-');
if(x >= 10) write(x / 10);
putchar(x % 10 + '0');
} int n;
struct Square
{
int l, r, len;
}s[maxn]; int main()
{
while(scanf("%d", &n) && n)
{
for(int i = 1; i <= n; ++i)
{
s[i].len = read();
s[i].l = 0;
for(int j = 1; j < i; ++j)
{
int tp;
if(s[i].len <= s[j].len) tp = s[j].l + s[j].len + s[i].len;
else tp = s[j].l + s[j].len * 3 - s[i].len;
if(tp > s[i].l) s[i].l = tp;
}
s[i].r = s[i].l + (s[i].len << 1);
}
for(int i = 2; i <= n; ++i)
for(int j = 1; j < i; ++j)
if(s[j].len < s[i].len && s[j].r > s[i].l) s[j].r = s[i].l;
else if(s[j].len > s[i].len && s[j].r > s[i].l) s[i].l = s[j].r;
for(int i = 1; i <= n; ++i)
if(s[i].l < s[i].r) write(i), space;
enter;
}
return 0;
}



然而我还是把他归到了计算几何这个分类……

最新文章

  1. 关于netty
  2. solr单机环境配置并包含外部单机zookeeper
  3. C# 插件式程序开发
  4. 【boost】使用装饰者模式改造boost::thread_group
  5. 【转】uvm 与 system verilog的理解
  6. FFT(快速傅立叶算法 for java)
  7. Qt之窗口动画(下坠、抖动、透明度)(还有好多相关帖子)
  8. c语言mysql api
  9. 201521123115 《Java程序设计》第5周学习总结
  10. kali linux 安装virtualbox报错(rc=-1908)
  11. 033_linux操作系统火焰图探测系统性能
  12. 软件工程_4th weeks
  13. ROADS POJ - 1724(分层最短路)
  14. EDK II之DXE Core的事件管理
  15. Typecho 官方文档 接口介绍
  16. IDEA2017.3.4破解方式及lombok图文配置详解
  17. .NET:CLR via C#:CLR Hosting And AppDomains
  18. python批量给云主机配置安全组
  19. [Compose] 17. List comprehensions with Applicative Functors
  20. ios开发-调用系统自带手势

热门文章

  1. 标准Trie字典树学习二:Java实现方式之一
  2. K:双栈法求算术表达式的值
  3. SQL Server 中位数、标准差、平均数
  4. Access MetaData
  5. Tomcat的学习和使用(一)
  6. Shellinabox安装及使用教程
  7. 推荐js库: underscore
  8. 使用wm_concat函数导致字符串过长
  9. SpringMVC中使用DispatcherServlet
  10. 利用Vagrant完成开发环境配置