zoukankan      html  css  js  c++  java
  • SRM 581 D2 L2:SurveillanceSystem,重叠度

    题目来源: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 ************************/
    


  • 相关阅读:
    指针数组和数组指针的区别 以及数组引用
    自定义触摸事件封装
    Android使用C++截屏并显示
    C++使用binder实例
    C++的友元类和友元函数实例
    使用C++在andrdoid上画贝塞尔曲线
    PowerManagerService分析(一)之PMS启动
    PowerManagerService分析(二)之updatePowerStateLocked()核心
    PowerManagerService分析(三)之WakeLock机制
    PowerManagerService分析(四)之亮屏流程分析
  • 原文地址:https://www.cnblogs.com/riskyer/p/3249286.html
Copyright © 2011-2022 走看看