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