uva10148 - Advertisement(广告)

给出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;
}



你可能感兴趣的:(uva10148 - Advertisement(广告))