Integer Intervals
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 11884 | Accepted: 5017 |
Description
An integer interval [a,b], a < b, is a set of all consecutive integers beginning with a and ending with b.
Write a program that: finds the minimal number of elements in a set containing at least two different integers from each interval.
Write a program that: finds the minimal number of elements in a set containing at least two different integers from each interval.
Input
The first line of the input contains the number of intervals n, 1 <= n <= 10000. Each of the following n lines contains two integers a, b separated by a single space, 0 <= a < b <= 10000. They are the beginning and the end of an interval.
Output
Output the minimal number of elements in a set containing at least two different integers from each interval.
Sample Input
4 3 6 2 4 0 2 4 7
Sample Output
4
输入输出:
输入:n,表示有n个区间,接下的n行,输入a,b,表示区间[a,b];
输出:在这些区间里面取得最少的元素,使得这些元素满足:包含每一个区间至少两个不同的元素
题目分析:
用数组d[i]表示从点0到i-1所包含的关键点的个数
那么题目中的条件转化为d[b+1] - d[a] >= 2 也就是: d[a] - d[b+1] <= -2; //注意:这里都是小于的格式,若是a-b > x,就转化为b-a < -x.
并且可以得到:d[i+1] - d[i] <= 1 和 d[i+1] - d[i] >= 0; 也就是:d[i] - d[I+1] <= 0;
建图,求d[max] - d[min]即可(max和min表示输入数据中的最大点和最小点)
代码:
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std ;
#define N 10010
#define INF 1<<30
struct Edge{
int v, w, next ;
}e[N<<2] ;
int head[N], cnt ;
int l, r ;
bool vis[N];
int s[N], d[N] ;
void init(){
memset(vis, 0, sizeof(vis)) ;
memset(head, -1, sizeof(head)) ;
cnt = 0 ;
}
void add(int u, int v, int w){
e[cnt].v = v ;
e[cnt].w = w ;
e[cnt].next = head[u] ;
head[u] = cnt++ ;
}
void spfa(){
for(int i=l; i<r; i++) d[i] = INF ;
int h = 0;
s[h++] = r ;
d[r] = 0;
while(h){
int u = s[--h] ;
vis[u] = 0 ;
for(int i=head[u]; i!=-1; i=e[i].next){
if(d[e[i].v] > d[u] + e[i].w){
d[e[i].v] = d[u] + e[i].w ;
if(!vis[e[i].v]){
vis[e[i].v] = 1 ;
s[h++] = e[i].v ;
}
}
}
}
}
int main(){
int n ;
while(scanf("%d", &n) == 1){
init() ;
l = 10000, r = 0 ;
for(int i=1; i<=n; i++){
int a, b ;
scanf("%d %d", &a, &b) ;
add(++b, a, -2) ;
r = max(r, b + 1) ;
l = min(l, a) ;
}
for(int i=l; i<r; i++){
add(i, i+1, 1) ;
add(i+1, i, 0) ;
}
spfa() ;
printf("%d\n", d[r] - d[l]) ;
}
return 0 ;
}