区间覆盖总长 | ||
[ Submit Code ] [ Top 20 Runs ] [ Runs Status ] | ||
Acceteped : 361 | Submit : 982 | |
Time Limit : 3500 MS | Memory Limit : 65536 KB | |
Description | ||
题目描述 在X轴上给你一些线段,问被这些线段覆盖的区间长。 输入 每个样例的第一行是一个整数K(K≤10000),表示线段的个数,如果K=0表示输入结束。以后的K行,每行为一个线段的左右端点x1,x2,(0 ≤ x1 < x2 ≤ 1,000,000,000)。 输出 每行输出一个样例的结果。 样例输入 2 1 2 2 3 3 1 3 0 2 5 6 0 样例输出 2 4 |
Source Code别直接抄,要交作业直接F12算了
Problem: 1126 User: 20220556****
Memory: 1284K Time: 343MS
Language: G++ Result: Accepted
Source Code
#include<stdio.h>
#include<stdlib.h>//qsort函数在这里
#include<string.h>//memset函数在这里
struct unit {
int start;
int end;
};//定义一个名为unit的结构体
//我们可以利用typedef关键字把结构体简化
//就像下面这样,后面的struct就可以省略了
//typedef struct{
// int start;
// int end;
//}unit;
struct unit ram[10005];//定义结构体数组
int structcmp(const void *p1,const void *p2){
return (( struct unit*)p1)->start-(( struct unit*)p2)->start;
}
//比较函数是核心,由于qsort函数设计者不知道你要比较什么,所以你需要指定比较的方式
//比较函数比较的关键是要返回一个int类型的值
//而qsort要求比较函数的两个参数是void类型的指针,而这种类型的指针是无法直接解引用的
//因此,如何得到一个值呢?通式如下:
//首先把void类型的指针强制转换为你所需要比较的类型,比如你比较的数组是int类型的
//那么就强制转换为int*,因此,由于我们所比较的数组元素类型为struct unit 类型的,因此转换为
//(struct unit*)类型的结构体指针
//接着,我们需要对结构体元素取出,我们需要.或者->
//->是从指针中取出元素,.是从结构体本身中取出
//因此 (( struct unit*)p1)->start 和 (*( struct unit*)p1).start都是可行的
//于是我们得到了int类型的数据,相减即可返回比较的方法
int main(){
int i,right,n,len;
while(scanf("%d",&n)&&n){
for( i=0;i<n;i++){
scanf("%d%d",&ram[i].start,&ram[i].end);
}
qsort(ram,n,sizeof ram[0],structcmp);
//qsort的定义如下:void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
//base -- 指向要排序的数组的第一个元素的指针。我们由于要排序数组,因此用数组名传入
//nitems -- 由 base 指向的数组中元素的个数。这里很关键,我们不用排序整个数组,因此传入n代表前n个
//size -- 数组中每个元素的大小,以字节为单位。
//在交换元素的时候,函数需要知道交换多少个字节,然后按字节交换
//compar -- 用来比较两个元素的函数。其实传入的是指向函数的指针
right=ram[0].end;
len=ram[0].end-ram[0].start;
for( i=1;i<n;i++){
if(ram[i].start>=right&&ram[i].end>right){
right=ram[i].end;
len+=ram[i].end-ram[i].start;
}
else if(ram[i].start<right&&ram[i].end>right){
len+=ram[i].end-right;
right=ram[i].end;
}
}
printf("%d\n",len);
memset(ram,0,sizeof ram);//sizeof ram 可以改成n,只初始化前n个元素也行,但3500ms的时间要求完全没必要了吧
}
}