zoukankan      html  css  js  c++  java
  • [CF1602F/1601D] Difficult Mountain

    前言

    update 2021.11.1 我本以为紫名就不用打 Div2 了,没想到有 Div2 上限是2100,但是可以打 Div1 了,好耶ヾ(✿゚▽゚)ノ

    难得的阳间比赛(指比赛时间),上大分!

    虽然今天下午状态还行,可惜最后一场 Div2 没能AK,不过竟然上榜了!人生首次!

    而且还是通过 Hack 了一个人从 rank5 翻到了 rank4,与机房大佬三连了。(rank2,3,4)

    首次使用 Hack,体验极佳,下次继续。

    所以水题解。

    题目

    CF

    题目大意:

    (n) 位登山者和一座初始困难度为 (d) 的山,每位登山者有两个值 (s_i,a_i) 表示TA的技能点和邋遢度。

    登山者 (i) 可以登山的前提是其困难度不超过 (s_i),当登山者 (i) 成功登山后,困难度会变为 (max(d,a_i))

    你需要找到一个合适的登山顺序以保证有最多的人成功登山,输出最大人数。

    (1le nle 5 imes 10^5;0le d,s_i,a_ile 10^9.)

    讲解

    这个贪心真的NB,完全想不到,但是知道了之后直呼NB!

    直接按 (max(s_i,a_i)) 的大小排序,如果相等按 (s_i) 大小排序,然后直接登山即可。

    简单分类讨论一下:

    1. (s_i<a_j),这里指的是 (i) 的最大值为 (s_i)(j) 的最大值为 (a_j),下同。此时如果把 (j) 放前面,(j) 如果成功上山,那么 (i) 一定上不了,不如先让 (i) 试试,不优。
    2. (a_i<s_j),强的留在后面总是不劣的。
    3. (s_i<s_j),同理不劣。
    4. (a_i<a_j),此时 (j) 如果上山,(i) 一定上不了山,显然取邋遢度小的在前更优。

    取等情况其实也差不多是这些思路,这道题就当缴智商税了。

    时间复杂度 (O(nlog_2n)),瓶颈在排序。

    还有码量较大的线段树优化DP做法,这里就不说了。

    代码

    超短代码
    //12252024832524
    #include <bits/stdc++.h>
    #define TT template<typename T>
    using namespace std;
    
    typedef long long LL;
    const int MAXN = 500005;
    int n,d;
    int s[MAXN],a[MAXN],p[MAXN];
    
    LL Read()
    {
    	LL x = 0,f = 1; char c = getchar();
    	while(c > '9' || c < '0'){if(c == '-') f = -1;c = getchar();}
    	while(c >= '0' && c <= '9'){x = (x*10) + (c^48);c = getchar();}
    	return x * f;
    }
    TT void Put1(T x)
    {
    	if(x > 9) Put1(x/10);
    	putchar(x%10^48);
    }
    TT void Put(T x,char c = -1)
    {
    	if(x < 0) putchar('-'),x = -x;
    	Put1(x); if(c >= 0) putchar(c);
    }
    TT T Max(T x,T y){return x > y ? x : y;}
    TT T Min(T x,T y){return x < y ? x : y;}
    TT T Abs(T x){return x < 0 ? -x : x;}
    
    int main()
    {
    //	freopen(".in","r",stdin);
    //	freopen(".out","w",stdout);
    	n = Read(); d = Read();
    	for(int i = 1;i <= n;++ i) s[i] = Read(),a[i] = Read(),p[i] = i;
    	sort(p+1,p+n+1,[](int x,int y){
    		if(Max(s[x],a[x]) ^ Max(s[y],a[y])) return Max(s[x],a[x]) < Max(s[y],a[y]);
    		return s[x] < s[y];
    	});
    	int ans = 0;
    	for(int i = 1;i <= n;++ i)
    		if(s[p[i]] >= d) ++ans,d = Max(d,a[p[i]]);
    	Put(ans,'
    ');
    	return 0;
    }
    

    后记

    有老哥按 (a_i+s_i)(a_i imes s_i) 排序,都过了!/jk

    update ? 也可以用类似上面的方法证明。

  • 相关阅读:
    对接某款商城系统[5]商城商品多级价格处理
    利用DelegatingHandler实现Web Api 的Api key校验
    采用Lambda表达式快速实现实体模型对象转换到DTO
    驱蚊器翁
    批量测试网络关系的小脚本
    jboss7访问日志功能及使用goaccess工具分析
    jetty使用jndi数据源
    sping junit test
    Too many open files解决方案及原理
    jboss7的JAX-WS客户端
  • 原文地址:https://www.cnblogs.com/PPLPPL/p/15463150.html
Copyright © 2011-2022 走看看