• 【贪心算法】舞蹈室的安排


    描述:

    新活有个舞蹈室,并且只有一个舞蹈室,假设申请时间以小时为单位,每天24个小时,每周就是168小时,我们规定申请时间从每周一的0点开始递增,比如申请时间区间为【1,24】就代表周一的0点到24点,时间区间【25,48】就代表周二的0点到24点,以此类推。

    现在假定你是舞蹈室的管理人员,面对一批使用舞蹈室的申请,你希望舞蹈室能尽可能给更多人使用(也就是尽可能满足更多申请数量,请注意,这里要求的并不是舞蹈室被使用的时间最多,而是被批准的申请数量最多),请你写一个程序判断这批申请里面最多能有多少个能被满足。比如有下列两个申请:

    【10,12】

    【11,160】

    由于同一时刻舞蹈室只能给一个申请使用,所以这两个申请最多只能满足1个。

    又如以下三个申请:

    【10,12】

    【155,168】

    【11,160】

    由于要求是让更多的申请能通过审批,所以我们选择的是【10,12】和【155,168】这两个区间,而不是【11,160】这个区间,所以结果是2。

    Input

    第一行是一个数字n,代表接下来有n个测试用例。

    对于每一个测试用例,格式如下:

    第一行是一个数字m,代表本周有m个申请,0 <= m < 150。

    接下来的m行,每行有两个数字,中间用空格隔开,代表该申请的时间区间(注意时间区间都是闭区间,且时间区间一定合法,不会超出【1,168】之外)

    Output

     每个测试用例输出一行,只有一个数字,代表最多能满足的申请个数。

    对于这n个测试用例,输出总共有n行

    Step1: 对时间区间按照结束时间升序排序

    Step2: 先结束先安排

    #include<iostream>
    using namespace std;
    
    struct Time
    {
    	int low;
    	int top;
    };
    
    void swap(Time a[], int j)
    {
    	Time temp = a[j];
    	a[j] = a[j + 1];
    	a[j + 1] = a[j];
    }
    
    int main()
    {
    	int m;
    	cin >> m;
    	while (m-- > 0)
    	{
    		int n;
    		cin >> n;
    		Time* a = new Time[n];
    
    		//输入	
    		for (int i = 0; i < n; i++)
    			cin >> a[i].low >> a[i].top;
    
    		//冒泡排序
    		for (int i = 0; i < n - 1; i++)
    			for (int j = i - 1; j >= 0 && a[j].top > a[j + 1].top; j--)
    				swap(a, j);
    
    		int count = 1;
    		//先结束先安排
    		for (int i = 1; i<n; i++)
    			if (a[i].low>a[i - 1].top)count++;
    
    		cout << count << endl;
    
    		delete a;
    	}
    
    	return 0;
    }
    

      

  • 相关阅读:
    GET 请求和 POST 请求
    爬虫
    模板继承
    静态文件配置
    终端cmd创建django
    商城商品分类导航效果
    css样式
    视图部分
    django初识和路由
    【源码分析】cocos2dx的Action
  • 原文地址:https://www.cnblogs.com/KennyRom/p/5951299.html
Copyright © 2020-2023  润新知