UVA 10020(Minimal coverage)贪心

题目链接:https://vjudge.net/problem/UVA-10020

题意:给出一个数M,再给出若干个小区间,问能否用这些小区间覆盖【0,M】,可以就输出最少的区间个数和对应区间,否则输出0.

#include<bits/stdc++.h>

using namespace std;
vector<pair<int,int> >v,ans;
bool cmp(pair<int,int> p1,pair<int,int>p2)
{
    return p1.second>p2.second;
}
int main()
{
   int T;
   while(cin>>T)
   {
       while(T--)
       {
           v.clear();
           ans.clear();
           int n;
           cin>>n;
           int l,r;
           while(cin>>l>>r&&(l||r))
           {
               if(!(r<=0||l>=n))
               v.push_back(make_pair(l,r));
           }
           sort(v.begin(),v.end(),cmp);
           int now=0;
           while(now<n)
           {
               bool flag=false;
               for(int i=0;i<v.size();i++)
               {
                   if(v[i].first<=now&&v[i].second>now)
                   {
                       ans.push_back(v[i]);

                       now=v[i].second;
                       v.erase(v.begin()+i);
                       flag=true;
                       i--;
                   }
               }
               if(!flag)
                break;
           }
           if(T)
            cout<<endl;
           if(now>=n)
           {
               cout<<ans.size()<<endl;
               for(int i=0;i<ans.size();i++)
               {
                   cout<<ans[i].first<<' '<<ans[i].second<<endl;
               }
           }
           else
           {
               cout<<0<<endl;
           }
       }
   }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/eknight123/article/details/80217288
今日推荐