zoukankan      html  css  js  c++  java
  • CF1602F. Difficult Mountain

    题意

    给一座山 初始高度为 (d)
    (n) 个人 每个人有属性 (a,s)
    表示他最高能爬上高度 (d) 小于等于 (s) 的山,他爬完山后,山的高度 (d=max(a,d))
    (n leq 5 imes10^5)

    题解

    其实是贪心。猜结论题。
    一般思路是按照 (a)(s) 排序 然后进行贪心
    对于这题 我们按照 (max(a,s)) 从小到大排序后,如果当前点能选择就选,得出的数量即为答案。
    首先,我们分情况讨论。对于(aleq s)的人,我们一定会选择,因为选择他不会对山的高度产生额外贡献。对于(a>s)的人,我们能在不影响上面人的情况下选择它。
    对于(max(a,s)),它代表当前这个人爬完山后能达到的最大高度,我们把这个高度从小到大排序,就能保证山的高度递增。然后对于 (max(a,s)) 相同的两个点 比较他们的 (s) 优先选择 (s) 更大的放在前面
    如果当前点(aleq s) 则它一定会被选到。否则我们比较一下山的当前高度和现在的 (s) 如果(s) 更大说明这个人爬山不会对后面产生影响,

    然后猜结论题代码一般都特别短。

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<map>
    #include<cstring>
    #include<stack>
    #include<queue>
    #include<vector>
    #include<bitset>
    #include<set>
    #define ll long long
    using namespace std;
    const int inf = 0x7fffffff;
    int n,d;
    #define maxn 1000009
    struct node{
    	int s,a;
    }a[maxn];
    int cmp2(node a,node b)
    {
    	if(max(a.a,a.s)==max(b.a,b.s))
    	{
    		return a.s<b.s;
    	}
    	return max(a.s,a.a)<max(b.a,b.s); 
    }
    int f[maxn],val[maxn],cnt=0;
    signed main()
    {
    	scanf("%d%d",&n,&d);
    	
    	int res=0;
    	for(int i=1;i<=n;i++)
    	{
    		scanf("%d%d",&a[i].s,&a[i].a);
    	}
    	sort(a+1,a+1+n,cmp2);
    	for(int i=1;i<=n;i++)	
    		if(d<=a[i].s)
    			d=max(d,a[i].a),res++;
    	printf("%d
    ",res);
    	return 0;
    }
    
  • 相关阅读:
    一:多线程--多线程简单介绍
    五:网络--多线程断点下载
    四:网络--NSURLConnection基本使用
    三:网络--数据安全/加密
    二:网络--GET请求和POST请求
    一:网络--HTTP协议
    源代码管理工具GIT
    MyBatis 多参问题
    jquery 事件
    jquery点击事件
  • 原文地址:https://www.cnblogs.com/lzy-blog/p/15464699.html
Copyright © 2011-2022 走看看