SRM 581 div1
o-- (+0/-0) 135.38pts (172/557) 1270 -> 1378 (+108)
easyだけしか解けなかったけど、まぁまぁ。
考え方は、まず同じ範囲を見られるようなカメラの数を数えておく。
もしも、どのように配置したとしてもカバーされるような時には、+,
配置次第ではカバーされるような場合には?を置けばいい。
どのようにも〜の判定式は、(ec[i] > lp-myrepo[rei])と書ける。
ただし、+は?よりも強いので、maxを取ることを忘れずに。
以下ソース
#include <iostream> #include <vector> #include <utility> #include <string> using namespace std; class SurveillanceSystem { public: string getContainerInfo(string containers, vector <int> reports, int L) { int N = containers.size(); vector<int> myrepo(L+1); for(int i=0;i<reports.size();i++){ myrepo[reports[i]]++; } vector<int> levels(containers.size(),0); for(int rei=0;rei<(int)myrepo.size();rei++){ if(myrepo[rei] == 0) continue; vector<int> vec(N); int lp = 0; for(int s=0;s<N-L+1;s++){ int e = s + (L-1); int cnt = 0; for(int i=s;i<=e;i++){ if(containers[i] == 'X') cnt++; } if(rei == cnt){ lp++; for(int i=s;i<=e;i++){ vec[i]++; } } } if(lp > 0){ for(int i=0;i<(int)vec.size();i++){ if(vec[i] > lp-myrepo[rei]){ levels[i] = 2; }else if(vec[i] > 0){ levels[i] = max(1,levels[i]); } } } } string ret = ""; for(int i=0;i<levels.size();i++){ if(levels[i] == 0){ ret.push_back('-'); }else if(levels[i] == 1){ ret.push_back('?'); }else{ ret.push_back('+'); } } return ret; } };