给出n个区间要求每个区间内只要有k个广告牌,求满足题目要求的最少的数目。
开始的时候想要从区间着手,想要求几个区间公共区域,让公共区域有尽量多的广告牌,结果失败。
重新审视这道题,,
我们从每个区间入手,首要条件要在这个区间内满足k个广告牌,在此条件下,让广告牌尽量向右排。
这道题要求的点都是整数且有10^4数量级个,
我想到了打表,然后让广告牌尽量安排到右端点附近处,以让别人利用到的几率更大。
这道题的复杂度为O(n)。
所以不用担心超时,
代码第一遍敲出来,错在排序上了,我们应该对右端点排序。
改正以后就a掉了,
代码如下:
#include <cstdio>
#include <cstring>
#include <cstdlib>
#define M 1010
#define N 20010
struct position{
int x, y;
};
bool hash[N];
int k, n, cc;
position a[M];
int comp(const void *a, const void *b)
{
position *aa = (position*)a, *bb = (position*)b;
if(aa->y!=bb->y) return aa->y-bb->y;
}
int count(int x, int y)
{
int ans = 0;
for(int i = x; i <= y; i++) if(hash[i+10000]) ans++;
return ans;
}
void solve(int x, int y, int cnt )
{
for(int i = y; i >= x&& cnt>0; i--)
if(hash[i+10000]==0){ hash[i+10000] = 1; cnt--; cc++; }
}
int main ()
{
int cas, tt = 0;
scanf("%d",&cas);
while(cas--)
{
scanf("%d%d",&k,&n);
for(int i = 0; i < n; i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
if(a[i].x>a[i].y)
{
int temp = a[i].x;
a[i].x = a[i].y;
a[i].y = temp;
}
}
memset(hash,0,sizeof(hash));
qsort(a,n,sizeof(a[0]),comp);
cc = 0;
for(int i = 0; i < n; i++)
{
int _x = a[i].x, _y = a[i].y;
int aa = count(_x,_y);
if(aa<k) solve(_x,_y,k-aa);
}
if(tt++) printf("\n");
printf("%d\n",cc);
for(int i = -10000; i <= 10000; i++) if(hash[i+10000])
printf("%d\n",i);
}
return 0;
}