UVA_10020_Minimal coverage

来源:互联网 发布:郑州学java 编辑:程序博客网 时间:2024/06/15 20:17
#include<iostream>#include<sstream>#include<string>#include<vector>#include<list>#include<set>#include<map>#include<stack>#include<queue>#include<algorithm>#pragma warning(disable:4996)#include<cstdio>#include<cstdlib>using std::cin;using std::cout;using std::endl;using std::stringstream;using std::string;using std::vector;using std::list;using std::pair;using std::set;using std::multiset;using std::map;using std::multimap;using std::stack;using std::queue;using std::priority_queue;vector<int> dfs(vector<int>&line, const vector<pair<int, int>>&segment, int i){vector<int>count;for (; i < segment.size(); i++){vector<int>temp;//如果除去这个段,仍能保证区间上所有数都被覆盖if (std::all_of(line.begin() + segment[i].first, line.begin() + segment[i].second + 1, [](int i) {return i >1; })){//那么区间的段上的都-1for (int j = segment[i].first; j <= segment[i].second; j++){line[j]--;}temp = dfs(line, segment, i + 1);temp.push_back(i);//回溯--恢复现场for (int j = segment[i].first; j <= segment[i].second; j++){line[j]++;}}count = count.size() > temp.size() ? count : temp;}return count;}int main(){//freopen("input.txt", "r", stdin);//freopen("output.txt", "w", stdout);int T;while (cin >> T){while (T--){int n;if (cin >> n){;}else{break;}vector<pair<int, int>>segment;map<pair<int, int>, pair<int, int>>Map;int left, right;while (cin >> left >> right){if (!left&&!right){break;}if (right<0 || left>n){continue;}segment.push_back({ std::max(0,left),std::min(n,right) });Map.insert({ { std::max(0,left),std::min(n,right) },{ left,right } });}std::sort(segment.begin(), segment.end());auto iter = std::unique(segment.begin(), segment.end());segment.resize(iter - segment.begin());vector<int>line(n + 1);for (size_t i = 0; i < segment.size(); i++){for (left = segment[i].first; left <= segment[i].second; left++){line[left]++;}}if (std::any_of(line.begin(), line.end(), [](int i) {return i == 0; })){cout << '0' << endl;if (T){cout << endl;}continue;}auto count = dfs(line, segment, 0);cout << segment.size() - count.size() << endl;vector<bool>hash(segment.size());for (size_t i = 0; i < count.size(); i++){hash[count[i]] = true;}for (size_t i = 0; i < hash.size(); i++){if (!hash[i]){cout << Map[segment[i]].first << ' ' << Map[segment[i]].second << endl;}}if (T){cout << endl;}}}return 0;}

0 0
原创粉丝点击