整数区间

整数区间
请编程完成以下任务:   
1.从文件中读取闭区间的个数及它们的描述;   
2.找到一个含元素个数最少的集合,使得对于每一个区间,都至少有一个整数属于该集合,输出该集合的元素个数。
【输入】
首行包括区间的数目n,1<=n<=10000,接下来的n行,每行包括两个整数a,b,被一空格隔开,0<=a<=b<=10000,它们是某一个区间的开始值和结束值。
【输出】
第一行集合元素的个数,对于每一个区间都至少有一个整数属于该区间,且集合所包含元素数目最少。
【样例输入】
4
  3 6
  2 4
  0 2
  4 7
【样例输出】
  2

【算法分析】
?算法模型:给n个闭区间[ai,bi], 在数轴上选尽量少的点,使每个区间内至少有一个点。
?算法:首先按b1<=b2<=...<=bn排序。每次标记当前区间的右端点x,并右移当前区间指针,直到当前区间不包含x,再重复上述操作。
?如下图,如果选灰色点,移动到黑色点更优。

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 struct section
 4 {
 5     int begin,end;
 6 };
 7 int cmp(const void *x,const void *y)
 8 {
 9     int ans1=(*(struct section *)x).end - (*(struct section *)y).end;
10     if(ans1>0) return 1;
11     else if(ans1<0) return -1;
12     else
13     {
14         ans1=(*(struct section *)y).begin - (*(struct section *)x).begin;
15         return ans1;
16     }
17 }
18 int main()
19 {
20     freopen("a.in","r",stdin);
21     freopen("a.out","w",stdout);
22     struct section *a;
23     int *b;
24     int n,i;
25     int lastEnd;
26     int count;
27
28     scanf("%d",&n);
29     a=(struct section *)malloc(n*sizeof(struct section));
30     b=(int *)malloc(n*sizeof(int));
31
32     for(i=0;i<n;i++)
33     {
34         scanf("%d%d",&a[i].begin,&a[i].end);
35         b[i]=-1;
36     }
37     qsort(a,n,sizeof(struct section),cmp);
38
39     lastEnd=-1;
40     count=0;
41     for(i=0;i<n;i++)
42     {
43         if(lastEnd>=a[i].begin) continue;
44         count++;
45         lastEnd=a[i].end;
46         b[count-1]=lastEnd;
47     }
48     /*for(i=0;i<count;i++)
49         printf("%d\n",b[i]);*/
50     printf("%d\n",count);
51     free(a);
52     free(b);
53     return 0;
54 }
时间: 2024-10-10 18:10:10

整数区间的相关文章

B - 整数区间

B - 整数区间 Time Limit: 1000/1000MS (C++/Others) Memory Limit: 65536/65536KB (C++/Others) Problem Description 一个整数区间[a,b](a < b),是一个从a到b连续整数的集合. 现在给你n个整数区间,编程找出一个集合R,使得n个集合中的每个集合都有2个整数出现在R中,并且这个集合R包含的整数个数最少. Input 第一行包含整数n(1 <= n <= 10000),表示整数区间的个数

1324:【例6.6】整数区间

1324:[例6.6]整数区间 时间限制: 1000 ms         内存限制: 65536 KB提交数: 1614     通过数: 1020 [题目描述] 请编程完成以下任务: 1.从文件中读取闭区间的个数及它们的描述: 2.找到一个含元素个数最少的集合,使得对于每一个区间,都至少有一个整数属于该集合,输出该集合的元素个数. [输入] 首行包括区间的数目n,1≤n≤10000,接下来的n行,每行包括两个整数a,b,被一空格隔开,0≤a≤b≤10000,它们是某一个区间的开始值和结束值.

求一个整数区间(从1到n)内1出现的次数

题目描述 求出1-13的整数中1出现的次数,并算出100-1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了.ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数). 暴力解法 比较简单的解法是从1到n顺次遍历,每遍历到一个数,依次求其每一位是否为1 //暴力法,时间复杂度是O(nlogn) // 遍历1~n,不断迭代检查各位是不是1 in

求两个整数区间的累加和(递归方法)

int main() { int n,m; int k=0; scanf("%d %d",&n,&m); k=sum(n,m); printf("%d\n",k); return 0; } int sum(int n,int m){ if(n<m){ return sum(n,m-1)+m; }else{ return n; } }

Swift语言指南(三)--语言基础之整数和浮点数

整数 整数指没有小数的整数,如42,-23.整数可以是有符号的(正数,零,负数),也可以是无符号的(正数,零). Swift提供了8,16,32,64位形式的有符号和无符号的整数,这些整数遵循与C语言相似的命名规则.如8位无符号整数的类型为UInt8,32位有符号整数的类型为Int32,和Swift语言的其它类型一样,这些整型命名以大写字母开头. 整数的边界 你可以通过min或max属性为每一个整数类型指定一个最小值或最大值: 1 let 最小值 = UInt8.min // 最小值 等于 0,

POJ1201 区间

题目大意: 给定n个整数区间[ai,bi]和n个整数ci,求一个最小集合Z,满足|Z∩[ai,bi]|>=ci(Z里边在闭区间[ai,bi]的个数不小于ci). 多组数据: n(1<=n<=50000)区间的个数 n行: ai bi ci(0<=ai<=bi<=50000,1<=ci<=bi-ai+1) _____________________________________________________ 这是一道查分约束题目. Si为0-i中包含在Z中

对于整数幂打表的一个技巧

如果我们需要在某个整数区间打一个幂表的话,有一个方法比较好用,比如我们要在1~5000之间,打满     1^1,    1^2,    1^3...............    1^5000     2^1,    2^2,    2^3...............    2^5000     3^1,    3^2.    3^3...............    3^5000     .......     ....... 5000^1,    5000^2,    5000^3, 

SQL Server中的RAND函数的介绍和区间随机数值函数的实现

    工作中会遇到SQL Server模拟数据生成以及数值列值(如整型.日期和时间数据类型)随机填充等等任务,这些任务中都要使用到随机数.鉴于此,本文将对SQL Server中随机数的使用简单做个总结 .   T-SQL 随机有关的三个函数          RAND([seed] 此函数生成从0到1之间随机 float 值(详细说明查看https://technet.microsoft.com/zh-cn/library/ms177610(v=sql.90).aspx). CHECKSUM

整数1维碰撞检测

直接两两检测是n方级别的时间复杂度,其实可以提高的.以下是一种基于排序的方法,针对1维,整数精度的情况,也就是许多整数区间中哪些相交的问题. 基本思想是对所有区间的下界和上届都混在一起进行排序,并记下每个端点的序号,如果某个区间的上界序号不是下界序号+1的话,那就说明发生了相交.在此基础上,可以二分查找和哪些个端点相交了.无碰撞情况时间复杂度是logN(快排,数量很大的话用计数基数排可以进一步降到N) + N(检查).全碰撞情况时间复杂度是logN + NlogN.这方法在时间和空间上算是做个折