Advertisement

#include<iostream>
#include<fstream>
#include<cstdlib>
using namespace std;

ifstream fin("C:\\data10.in");

struct node
{
       node(int beg=0,int end=0):startpos(beg),endpos(end){}
       node& operator=(const node& nd)
       {
            startpos=nd.startpos;
            endpos=nd.endpos;
            return *this;
       }
       int startpos;
       int endpos;
};

int K,N,M;
node interval[1000];
int billboard[1000];

void sort()
{
     for(int i=1;i<N;++i)
     {
          for(int j=i;j>0;--j)
          {
               node nd;
               if(interval[j].endpos<interval[j-1].endpos)
               {
                    nd=interval[j];
                    interval[j]=interval[j-1];
                    interval[j-1]=nd;
               }
               else if(interval[j].endpos==interval[j-1].endpos) 
               {
                    if(interval[j].startpos<interval[j-1].startpos)
                    {
                         nd=interval[j];
                         interval[j]=interval[j-1];
                         interval[j-1]=nd;
                    }
                    else
                         break;
               }
          }
     }
}


void Init()
{
     fin>>K>>N;
     int beg,end;
     M=0;
     for(int i=0;i<1000;++i)
     billboard[i]=0;
     for(int i=0;i<N;++i)
     {
          fin>>beg>>end;
          if(beg>end)
          {
               int temp=beg;
               beg=end;
               end=temp;
          }
          node nd(beg,end);
          interval[i]=nd;
     }
     sort();
}


void FillBillBoard()
{
     for(int i=0;i<N;++i)
     {
          int cnt=0;
          if(i==0)
          {
               for(int j=interval[0].endpos;j>=interval[0].startpos;--j)
               {
                    billboard[j]=1;
                    ++cnt;
                    ++M;
                    if(cnt>=K)
                    break;
               }
          }
          //i!=0的情况本可以合并,但出于利益最大化的角度考虑,将i=N-1和i!=N-1分开来写,以更好地模拟实际情况
          else if(i==N-1)
          {
               for(int j=interval[j].startpos;j<=interval[j].endpos;++j)
               {
                    if(billboard[j]==1)
                    {
                         ++cnt;
                         if(cnt>=K)
                              break;
                    }
               }
               if(cnt>=K)
                    continue;
               for(int j=interval[j].startpos;j<=interval[j].endpos;++j)
               {
                    if(billboard[j]==0)
                    {
                         billboard[j]=1;
                         ++cnt;
                         ++M;
                         if(cnt>=K)
                              break;
                    }
               }
          }
          else
          {
               for(int j=interval[i].startpos;j<=interval[i].endpos;++j)
               {
                    if(billboard[j]==1)
                         ++cnt;
               }
               if(cnt>=K)
                    continue;
               for(int j=interval[i].endpos;j>=interval[i].startpos;--j)
               {
                    if(billboard[j]==0)
                    {
                         billboard[j]=1;
                         ++cnt;
                         ++M;
                         if(cnt>=K)
                              break;
                    }
               }
          }
     }
}


void print()
{
     cout<<M<<endl;
     for(int i=1;i<interval[N-1].endpos;++i)
     {
          if(billboard[i]==1)
               cout<<i<<endl;
     }
}


int main()
{
     Init();
     FillBillBoard();
     print();
     system("pause");
     return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值