分析:数据中并不存在无解的情况......

每个摄像头都要覆盖尽可能多的点,按照y从小到大排序.对于每一列,只用判断第一个没有被观测到的就可以了,这个点必须要放摄像头,因为除了它自己没有其它的摄像头能观测到它了,如果它的下面有摄像头没有覆盖到,那么它就必须要观测下面,否则观测右边是最优的.

以为会爆炸的,结果A了......

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; int T, n, m, q, visx[], visy[], ans, cantx[], canty[];
bool flag2 = false; struct node
{
int x, y;
}e[]; bool cmp(node a, node b)
{
if (a.y == b.y)
return a.x < b.x;
return a.y < b.y;
} int main()
{
scanf("%d", &T);
while (T--)
{
ans = ;
memset(visx, , sizeof(visx));
memset(visy, , sizeof(visy));
memset(cantx, , sizeof(cantx));
memset(canty, , sizeof(canty));
scanf("%d%d%d", &n, &m, &q);
for (int i = ; i <= q; i++)
scanf("%d%d", &e[i].x, &e[i].y);
sort(e + , e + + q, cmp);
for (int i = ; i <= q; i++)
{
if (!cantx[e[i].x] && !canty[e[i].y] && !visx[e[i].x] && !visy[e[i].y])
{
bool flag = false;
for (int j = i + ; e[j].y == e[i].y; j++)
{
if (!visx[e[j].x])
{
flag = true;
break;
}
}
if (flag)
visy[e[i].y] = ;
else
visx[e[i].x] = ;
cantx[e[i].x] = canty[e[i].y] = ;
ans++;
}
}
printf("%d\n", ans);
} return ;
}

最新文章

  1. UEditor编辑器使用示例
  2. php简单实现socket通信
  3. ui-router带参数的ui-sref配置
  4. IBM云的商业动作之我见(1):IBM 收购 OpenStack 托管私有云公司 Blue Box [IBM Acquired Blue Box]
  5. PO、VO、DAO、BO、POJO
  6. [游戏模版15] Win32 飞机射击
  7. 九度OJ 1118 数制转换
  8. Qt程序开机启动的怪现象————无法正常显示程序皮肤
  9. Android Animation学习(二) ApiDemos解析:基本Animatiors使用
  10. Atitit.软件GUIbutton和仪表板(01)--警报系统--
  11. bzoj2748
  12. 【RNN】资源汇总
  13. Windows查看Java内存使用情况
  14. 洛谷1894 [USACO4.2]完美的牛栏The Perfect Stall
  15. dos常用命令使用说明
  16. markdown 语法简要备忘
  17. 简单线性dp
  18. 线程(Thread)和异常
  19. 第2章、数据与简单计算程序(c语言入门)
  20. Oracle行转列,pivot函数和unpivot函数

热门文章

  1. bzoj 1690: [Usaco2007 Dec]奶牛的旅行【01分数规划+spfa】
  2. P3990 [SHOI2013]超级跳马
  3. [App Store Connect帮助]六、测试 Beta 版本(2)输入测试信息以供外部测试
  4. Moco模拟服务器post&amp;get请求 (二)
  5. Nginx(三) 常用配置整理
  6. 微信小程序去除button边框
  7. ibatis入门教程一
  8. 预采订单管理接收来源App数据
  9. oa系统部署
  10. Handling unhandled exceptions and signals