zoukankan      html  css  js  c++  java
  • 整数区间

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

     其实o(n^2)的算法很好想,但o(n)就比较狗了。主要思路就是两个变量f1,f2,假设取这两个点。剩下看代码。

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    struct node{
    	int a;
    	int b;
    };
    node m[1000];
    bool cmp(node a,node b) //头从小到大排序 
    {
    	if(a.a != b.a)
    	{
    		return a.a < b.a;
    	}
    	else
    	return a.b < b.b;
    }
    int main()
    {
    	int n,f1,f2,tot = 0;
    	cin>>n;
    	for(int i = 1;i <= n;i++)
    	{
    		cin>>m[i].a>>m[i].b;
    	}
    	sort(m + 1,m + n + 1,cmp);
    	f1 = m[n].a;
    	f2 = m[n].a + 1;
    	tot += 2;
    	for(int i = n - 1;i > 0;i--)
    	{
    		if(m[i].b < f1) //两区间分离,则同时改变f1,f2,f1 = 头;f2 = 头+1; 
    		{
    			tot += 2;
    			f1 = m[i].a;
    			f2 = f1 + 1;
    		}
    		else if(m[i].b < f2) //两区间重合,f2 = 原来的f1,f1 = 现在区间的头 
    		{
    			tot ++;
    			f2 = f1;
    			f1 = m[i].a;
    		}
    	}
    	cout<<tot<<endl;
    	return 0;
    }
    /*
    4
    3 6
    2 4
    0 2
    4 7
    */
    
  • 相关阅读:
    关于两次fork
    阻塞非阻塞与同步异步的区别
    函数调用堆栈
    数组
    64位操作系统与32位操作系统数据类型的字节数
    Redis 键(key)
    Redis 命令
    Redis 安装
    Redis 配置
    MongoDB 安装
  • 原文地址:https://www.cnblogs.com/DukeLv/p/8587151.html
Copyright © 2011-2022 走看看