UVA 10148 Advertisement 贴广告的艺术 贪心 区间选点

2014-11-23 22:08:33 ? 作者: ? 浏览: 4
分析:贴小广告的也好辛苦啊(大雾)。
注意如果区间长度小于k的话贴满了就行。
这就是区间选点问题的变形题。排序后从每个区间后面选起就行了。
代码:
题意:一段路上,给出n个慢跑者跑步的区间,给出k,要求让每个慢跑者都能看到k个广告,区间都是整数操作,也就是说一个广告只能放在一个整数上,求最小贴的广告数。

 /* 
 *   Author:        illuz  
 *   Blog:          http://blog.csdn.net/hcbbt 
 *   File:          uva10148.cpp 
 *   Lauguage:      C/C++ 
 *   Create Date:   2013-09-06 19:58:01 
 *   Descripton:    UVA 10148 Advertisement, 区间选点 
 */  
#include   
#include   
#include   
using namespace std;  
#define rep(i, n) for (int i = 0; i < (n); i++)  
#define repf(i, a, b) for (int i = (a); i <= (b); i++)  
#define mc(a) memset(a, 0, sizeof(a))  
  
const int MAXN = 1001;   
const int T = 10000;  
  
struct P {  
    int lhs, rhs;  
} p[MAXN];  
int k, n, a, b;  
int hash[T * 2 + 2];  
  
bool cmp(P a, P b) {  
    return a.rhs < b.rhs;  
}  
  
int main() {  
    int t;  
    scanf("%d", &t);  
    rep(cas, t) {  
        mc(hash);  
        // input  
        scanf("%d%d", &k, &n);  
        rep(i, n) {  
            scanf("%d%d", &a, &b);  
            if (a > b) p[i].lhs = b + T, p[i].rhs = a + T;  
            else p[i].lhs = a + T, p[i].rhs = b + T;  
        }  
        sort (p, p + n, cmp);  
        // solve  
        int tk, cnt = 0;  
        rep(i, n) {  
            tk = 0;  
            repf(j, p[i].lhs, p[i].rhs)  
                if (hash[j])  
                    tk++;  
            for (int j = p[i].rhs; j >= p[i].lhs && tk < k; j--)  
                if (!hash[j]) {  
                    hash[j]++;  
                    cnt++; tk++;  
                }  
        }  
        if (cas) printf("\n");  
        printf("%d\n", cnt);  
        rep(i, 2 * T + 1) if (hash[i]) printf("%d\n", i - T);  
    }  
    return 0;  
}  


-->

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: