xtuoj1126 区间覆盖总长

区间覆盖总长

Submit Code ] [ Top 20 Runs ] [ Runs Status ]
Acceteped : 361Submit : 982
Time Limit : 3500 MSMemory 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的时间要求完全没必要了吧
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值