zoukankan      html  css  js  c++  java
  • [wikioi]线段覆盖

    http://wikioi.com/problem/1214/ 这道题也归为贪心了。我也不是很能分辨,但想法确实是:1.有阶段最优化性;2.前一状态和后一状态有关系。

    想法:
    1.排个序是很自然的想法,假设按照左端点排序吧;
    2.然后从左往右取,那么会遇到i+1的左端和当前最右端是否冲突的问题;
    3.如果不冲突,就把i+1放进来;如果冲突,那么取i+1还是之前的那个呢,就看拿个的右端更小;
    4.因为反正两个里面取一个,不会改变左边的最多能取的线段树,而右端更小使右边能取的线段树可能更多;
    5.所以每次比较处理后,比如i处理完了,那么就计算完到i为止能取的最多线段数目,也记录了当前组合最右的断点;
    6.排序为了代码简单,就冒泡了一下,也不超时,就先这样了;

    #include <iostream>
    using namespace std;
    void swap(int &a, int &b)
    {
    	int tmp = a;
    	a = b;
    	b = tmp;
    }
    
    int main()
    {
    	int a[100][2];
    	int n;
    	cin >> n;
    	for (int i = 0; i < n; i++)
    	{
    		cin >> a[i][0];
    		cin >> a[i][1];
    		if (a[i][0] > a[i][1])
    		{
    			swap(a[i][0], a[i][1]);
    		}
    	}
    	for (int i = 0; i < n; i++)
    	{
    		for (int j = i+1; j < n; j++)
    		{
    			if (a[i][0] > a[j][0])
    			{
    				swap(a[i][0], a[j][0]);
    				swap(a[i][1], a[j][1]);
    			}
    		}
    	}
    	int rightEnd = a[0][1];
    	int sum = 1;
    	for (int i = 1; i < n; i++)
    	{
    		if ( rightEnd > a[i][0])
    		{
    			if (a[i][1] < rightEnd) rightEnd = a[i][1];
    		}
    		else
    		{
    			sum++;
    			rightEnd = a[i][1];
    		}
    	}
    	cout << sum;
    }
    

      

  • 相关阅读:
    使用css制作三角
    BZOJ3029: 守卫者的挑战
    Codeforces 442B. Andrey and Problem
    嘴巴题8 BZOJ2318: Spoj4060 game with probability Problem
    嘴巴题7 BZOJ1426: 收集邮票
    嘴巴题6 BZOJ3450JoyOI1952 Easy
    BZOJ1453: [Wc]Dface双面棋盘
    BZOJ2957: 楼房重建
    BZOJ4515: [Sdoi2016]游戏
    BZOJ3679: 数字之积
  • 原文地址:https://www.cnblogs.com/lautsie/p/3275862.html
Copyright © 2011-2022 走看看