题目来源: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. 什么是Activity、生命周期

    1.什么是Activity 1.当程序第一次运行时用户就会看这个Activity,这个Activity可以通过启动其他的Activity进行相关的操作. 2.当启动其他的Activty时这个当前的这个 ...

  2. linux scp ssh命令不用输入密码

    把你的本地主机用户的ssh公匙文件复制到远程主机用户的~/.ssh/authorized_keys文件中 假设本地主机linux100,远程主机linux200 一,在linux100主机里的用户 运 ...

  3. 【Leetcode】查找二叉树中任意结点的最近公共祖先(LCA问题)

    寻找最近公共祖先,示例如下: 1 /           \ 2           3 /    \        /    \ 4    5      6    7 /    \          ...

  4. Bag of Words(BOW)模型

    原文来自:http://www.yuanyong.org/blog/cv/bow-mode 重复造轮子并不是完全没有意义的. 这几天忙里偷闲看了一些关于BOW模型的知识,虽然自己做图像检索到目前为止并 ...

  5. linux shell自定义函数(定义、返回值、变量作用域)介绍

    http://www.jb51.net/article/33899.htm linux shell自定义函数(定义.返回值.变量作用域)介绍 linux shell 可以用户定义函数,然后在shell ...

  6. 小米手机与魅族的PK战结果 说明了什么

    我国电子商务面临的问题,淘宝退出百度无疑是一个遗憾.当在网上购物时.用户面临的一个非常大的问题就是怎样在众多的站点找到自己想要的物品,并以最低的价格买到.自从淘宝退出百度.建立自己的搜索引擎后,广大消 ...

  7. HTML5 Web Workers来加速您的移动Web应用

    一直以来,Web 应用程序被局限在一个单线程世界中.这的确限制了开发人员在他们的代码中的作为,因为任何太复杂的东西都存在冻结应用程序 UI 的风险.通过将多线程引入 Web 应用程… 在本文中,您将使 ...

  8. JAVA Socket获取服务端信息

    1.Socket.getInetAddress(),获取服务端地址. 2.Socket.getPort(),获取服务端端口.

  9. sublime常用快捷键整理(未完待续)

    sublime常用快捷键整理: 基本操作 cmd+o 打开文件 cmd+w 关闭当前tab cmd+n 打开新页 cmd+shift+n 打开刚刚关闭的页签 一.选择命令 1.多个单词选择 cmd+d ...

  10. javascript模式——Prototype模式

    GoF权威的解释是,原型模式是一种通过对一个对象的克隆,创建基于这个对象的多种对象的模式. 为了实现这种原型模式,可以直接使用ECMAScript 5 中的方法Object.create.它不紧可以创 ...