UVa 10148 - Advertisement
2016-04-05 19:00
357 查看
题意:
在一个街道上有很多广告位,现在一家公司需要投放广告,要针对具体情况投放。给定一个K值,假如慢跑者经历K以上个路段,至少要看到K个广告位,经历少于等于K个,则需要让慢跑者看到全部广告位,求投放的最少的广告位。
思路:贪心+排序
对于慢跑者经历的路段区间,按区间右端点升序排序,从区间最右端向左遍历每一个慢跑者的区间,对需要设置的广告位进行标记,最后输出标记的点。
注意:输入数据有负值,我的办法是加上一个数,使其转换成非负数。
代码:
在一个街道上有很多广告位,现在一家公司需要投放广告,要针对具体情况投放。给定一个K值,假如慢跑者经历K以上个路段,至少要看到K个广告位,经历少于等于K个,则需要让慢跑者看到全部广告位,求投放的最少的广告位。
思路:贪心+排序
对于慢跑者经历的路段区间,按区间右端点升序排序,从区间最右端向左遍历每一个慢跑者的区间,对需要设置的广告位进行标记,最后输出标记的点。
注意:输入数据有负值,我的办法是加上一个数,使其转换成非负数。
代码:
#include <iostream> #include <cstring> #include <cstdio> #include <cstdlib> #include <algorithm> using namespace std; #define MAXN 20000 + 10 #define MAXA 1020 #define PLUS 10009 struct Jogger{ int _start; int _end; }; bool cmp(const Jogger &a,const Jogger &b){ if(a._end < b._end) return true; else return false; } class Advertise{ private: int adNum; int joggerNum; Jogger joggers[MAXA]; int ansNum; bool isMark[MAXN]; public: void init(); void readData(); void process(); void output(); }; void Advertise::init(){ memset(isMark,false,sizeof(isMark)); adNum = 0; joggerNum = 0; ansNum = 0; } void Advertise::readData(){ init(); scanf("%d %d",&adNum,&joggerNum); for(int i = 0;i < joggerNum;i++) { int t1,t2; scanf("%d %d",&t1,&t2); if(t1 > t2) { joggers[i]._start = t2 + PLUS; joggers[i]._end = t1 + PLUS; } else{ joggers[i]._start = t1 + PLUS; joggers[i]._end = t2 + PLUS; } } } void Advertise::process(){ sort(joggers,joggers + joggerNum,cmp); for(int i = 0;i < joggerNum;i ++){//遍历每一个慢跑者 if(joggers[i]._end - joggers[i]._start + 1 <= adNum){ //慢跑者跑过的广告牌数小于顾客要求的情况 for(int k = joggers[i]._end;k >= joggers[i]._start;k--)//遍历慢跑者经过的广告牌 isMark[k] = true; } else{ //慢跑者跑过的广告牌数大于顾客要求的情况 int markNum = adNum; for(int j = joggers[i]._start;j <= joggers[i]._end;j++){//遍历慢跑者经过的广告牌 if(isMark[j]) markNum--; } for(int j = joggers[i]._end;j >= joggers[i]._start;j--){ if(markNum <= 0) break; else if(!isMark[j]){ isMark[j] = true; markNum--; } else continue; } } } } void Advertise::output(){ for(int i = 0;i < MAXN;i++){ if(isMark[i])ansNum++; } printf("%d\n",ansNum); for(int i = 0;i < MAXN;i++){ if(isMark[i]){ printf("%d\n",i - PLUS); } } } int main() { // #ifndef ONLINE_JUDGE // freopen("D:\\acm.txt","r",stdin); // #endif // ONLINE_JUDGE Advertise adver; int cases; scanf("%d",&cases); while(cases--){ adver.readData(); adver.process(); adver.output(); if(cases > 0)printf("\n"); } return 0; }
相关文章推荐
- 第五周上机时间项目1(1)
- 第6周项目2(3)画出变量占用的内存及值得变化
- 分治算法--寻找第k大数
- Android图片与内存基础知识
- 数据结构-java与c实现带头结点的单链表
- JAVA实验一程序控制语句和JAVA编译器的使用
- Uva 107 The Cat in the Hat
- C++中的delete和delete[]的区别
- 二叉树的层次遍历
- 树状数组(Binary Indexed Trees,二分索引树)
- Poj 2352 Star
- POJ 3468 A Simple Problem with Integers
- Uva 459 Graph Connectivity
- Uva 10583 Ubiquitous Religions
- Uva 10608 Friends
- Uva 793 Network Connections
- Uva 10305 Ordering Tasks
- 最小生成树-Prim算法和Kruskal算法
- ACM中出现RuntimeError的原因及可能的解决办法
- UVa 10034 - Freckles