您的位置:首页 > 其它

UVA_10020_Minimal coverage

2016-04-24 22:33 274 查看
#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;
int main()
{
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
int T;
while (cin >> T)
{
sign:
while (T--)
{
int n; cin >> n;
vector<pair<int, int>>segment;
vector<int>result;
int left, right;
while (cin >> left >> right)
{
if (!left&&!right)
{
break;
}
if (right<0 || left>n)
{
continue;
}
segment.push_back({ left,right });
}
right = 0;
int j = 1000000000;
for (int i = 0; i != segment.size(); i++)
{
if (segment[i].first <= 0 && segment[i].second > right)
{
j = i;
right = segment[i].second;
}
}
if (j == 1000000000)
{
cout << '0' << endl;
if (T)
{
cout << endl;
}
continue;
}
else
{
result.push_back(j);
}
size_t i = 0;
do
{
left = right;
if (right >= n)
{
break;
}
int k = 1000000000;
for (j=0;j!=segment.size();j++)
{
if (segment[j].first <= left&&segment[j].second > right)
{
right = segment[j].second;
k = j;
}
}
if (k == 1000000000)
{
cout << '0' << endl;
if (T)
{
cout << endl;
}
goto sign;
}
else
{
result.push_back(k);
}
i++;
}while(i!=segment.size());
cout << result.size() << endl;
for (size_t i = 0; i < result.size(); i++)
{
cout << segment[result[i]].first << ' ' << segment[result[i]].second << endl;
}
if (T)
{
cout << endl;
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: