题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=12588

在判断 ‘+’ 的时候使用了 重叠度 的概念,跟一般的 “先去掉这个位置,看剩下的位置能不能符合条件” 方法不太一样。

代码如下:

#include <algorithm>
#include <numeric>
#include <iterator>
#include <functional> #include <iostream>
#include <sstream> #include <string>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map> #include <cstdio>
#include <cstdlib>
#include <cctype>
#include <climits>
#include <cmath>
#include <cstring> using namespace std; /************** Program Begin *********************/
const int MAX = 50;
int flag[MAX];
class SurveillanceSystem {
public:
string getContainerInfo(string containers, vector <int> reports, int L) {
string res(containers.size(), '-');
vector < vector<int> > pos( containers.size()+1 );
// pos[c]表示能够监视到c个'X'的所有的位置的起始处
vector <int> rep_count( L+1 ); // rep_count[c]表示,reports中c出现的次数 for (int i = 0; i <= containers.size()-L; i++) {
int c = count(&containers[i], &containers[i]+L, 'X');
// 计算各个位置能监视到的'X'
pos[c].push_back(i);
}
for (int i = 0; i < reports.size(); i++) {
++rep_count[ reports[i] ];
} for (int i = 0; i <= L; i++) {
int rc = rep_count[i];
if (rc == 0) {
continue;
} // 表示i在reports中出现rc次,而满足可以监视到i个'X'的段保存在pos[i]中,
// 一共有pos[i].size个这样的段,也就是要从中选出rc个段,使用每个位置的
// 重叠度来判断该位置是否一定会被监视到。位置的重叠度表示该位置在
// pos[i].size个段中出现的次数。如果其出现次数大于pos[i].size-rc,则
// 这个位置一定会被监视到。因为如果这个位置没有被监视的话,那么找不符合
// 条件的rc个段。
memset(flag, 0, sizeof(flag));
for (int j = 0; j < pos[i].size(); j++) {
for (int k = 0; k < L; k++) {
if ('-' == res[ pos[i][j] + k ]) {
// 在段中出现的位置置为'?'
res[ pos[i][j] + k ] = '?';
}
++flag[ pos[i][j]+k ]; // 该位置重叠度加1
}
}
for (int j = 0; j < containers.size(); j++) {
if (flag[j] > pos[i].size() - rc) {
//判断重叠度,判断该位置是否必定被监视
res[j] = '+';
}
}
} return res;
}
}; /************** Program End ************************/

SRM 581 D2 L2:SurveillanceSystem,重叠度的更多相关文章

  1. SRM 588 D2 L2:GUMIAndSongsDiv2,冷静思考,好的算法简洁明了

    题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=12707 算法决定一切,这道题目有很多方法解,个人认为这里 ve ...

  2. SRM 581 D2 L3:TreeUnionDiv2,Floyd算法

    题目来源:http://community.topcoder.com//stat?c=problem_statement&pm=12587&rd=15501 这道题目开始以为是要在无向 ...

  3. SRM 620 DIV1 L2

    题意:有n个等长的string(设string的长度为m),string中的字符从'A'到'Z',容许对m列执行稳定的排序操作,问说是否能通过这m种操作将这n个string调整成对应的顺序. 题解: ...

  4. SRM 585 DIV1 L2

    记录dp(i, j)表示前i种卡片的排列,使得LISNumber为j的方法数. #include <iostream> #include <vector> #include & ...

  5. SRM 588 D2 L3:GameInDarknessDiv2,DFS

    题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=12710 采用DFS搜索,第一次写的时候忘了加访问标志,结果状态 ...

  6. Topcoder口胡记 SRM 562 Div 1 ~ SRM 599 Div 1

    据说做TC题有助于提高知识水平? :) 传送门:https://284914869.github.io/AEoj/index.html 转载请注明链接:http://www.cnblogs.com/B ...

  7. 高效求幂取余 算法,复杂度 log(n)

    做TopCoder SRM 576 D2 L3 题目时,程序有个地方需要对一个数大量求幂并取余,导致程序运行时间很长,看了Editoral之后,发现一个超级高效的求幂并取余的算法,之前做System ...

  8. 利用opencv作透明重叠人群密度热度图

    在作热度图的时候我们经常需要将热度图调整透明度后叠加在原图上达到更好的展示效果.比如检测人气密度的热度图: (来自sensetime) 一般作图的时候会第一时间想到matplotlib,因为可以很方便 ...

  9. py_faster_rcnn识别出来的结果好多红框重叠

    py_faster_rcnn识别出来的结果好多红框重叠, 可以通过调节demo.py中的NMS_THRESH的值进行限制. NMS_THRESH表示非极大值抑制,这个值越小表示要求的红框重叠度越小,0 ...

随机推荐

  1. js跑马灯效果

    function nextPage() {           /*         克隆第一张图片并添加到box后         box前移一张图片的距离动画         动画回调里把box的 ...

  2. 如何学好C语言

    我相信,这可能是很多朋友的问题,我以前也有这样的感觉,编程编到一定的时候,发现能力到了瓶颈,既不深,也不扎实,半吊子.比如:你长期地使用Java和.NET ,这些有虚拟机的语言对于开发便利是便利,但是 ...

  3. 【关于360极速浏览器的xx极速模式自动切换到兼容模式】

    原理上是可以的. 1  360基于Chromium 开源浏览器内核,它本身就是一个壳子.. 2  7.0之后的极速浏览器,不支持 它官方的那个声明标记.<meta name=”renderer” ...

  4. 【N年前的文章脑补:HttpHandler HttpModule入门篇】

    HttpHandler HttpModule入门篇 ASP.Net处理Http Request时,使用Pipeline(管道)方式,由各个HttpModule对请求进行处理,然后到达 HttpHand ...

  5. [Leetcode][Python]47: Permutations II

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 47: Permutations IIhttps://oj.leetcode. ...

  6. C编译器、链接器、加载器详解

    摘自http://blog.csdn.net/zzxian/article/details/16820035 C编译器.链接器.加载器详解 一.概述 C语言的编译链接过程要把我们编写的一个c程序(源代 ...

  7. Oozie入门

    作者 Boris Lublinsky, Michael Segel ,译者 侯伯薇 发布于 2011年8月18日 |注意:QCon全球软件开发大会(北京)2016年4月21-23日,了解更多详情! 分 ...

  8. UVA 1617 Laptop

    题意: 有n条长度为1的线段,确定他们的起点,必须是整数,使得第i条线段在[ri,di]之间.最后输出空隙的最小值 分析: 原始数据排序,排序的规则是先按照右端点排序,右端点相同的情况下,再按照左端点 ...

  9. windows下如何使用ssh远程登录Linux

    1.ssh的安装 sudo apt-get install ssh 或者在Linux情况下,自带有ssh,从第二步开始   2.生成密钥 ssh-keygen 中间过程会提示你存放密钥的地方Enter ...

  10. C++结构体中sizeof(1)

    sizeof sizeof操作符的作用是返回一个对象或类型名的长度,长度的单位是字节. 返回值的类型是标准库命名为size_t的类型,size_t类型定义在cstddef头文件中,该头文件是C标准库的 ...