uva10148 - Advertisement(广告)

来源:互联网 发布:原始dbc数据 编辑:程序博客网 时间:2024/05/11 01:59

给出n个区间要求每个区间内只要有k个广告牌,求满足题目要求的最少的数目。

开始的时候想要从区间着手,想要求几个区间公共区域,让公共区域有尽量多的广告牌,结果失败。

重新审视这道题,,

我们从每个区间入手,首要条件要在这个区间内满足k个广告牌,在此条件下,让广告牌尽量向右排。

这道题要求的点都是整数且有10^4数量级个,

我想到了打表,然后让广告牌尽量安排到右端点附近处,以让别人利用到的几率更大。

这道题的复杂度为O(n)。

所以不用担心超时,

代码第一遍敲出来,错在排序上了,我们应该对右端点排序。

改正以后就a掉了,

代码如下:

#include <cstdio>#include <cstring>#include <cstdlib>#define M 1010#define N 20010struct 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;}



原创粉丝点击