码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • C. Doremy‘s IQ(贪心)


    Problem

    给出一个长度为n的序列a,按次序遍历。现在给出一个q,按次序对 a [ i ] a[i] a[i]进行测试。测试时,执行以下操作:

    • 如果 q ≥ a [ i ] q \geq a[i] q≥a[i], q不变
    • 如果 q < a [ i ] q < a[i] q<a[i], q = q − 1 q = q - 1 q=q−1

    可以跳过某个测试,q不发生变化。当q = 0时,终止。
    问最多可以执行几次测试,输入最优方案的01序列。

    Solution

    首先考虑到前面执行测试会影响到后面的情况,所以就可以考虑反向思考。当然也可以正向思考,只不过正向思考比较麻烦。
    方法一:正向思考,贪心+二分
    方法二:逆向思考,贪心

    One

    结论:
![在这里插入图片描述](https://img-blog.csdnimg.cn/3940d705ac6b4bcaa35a4febbb9e8f87.png)

    那些会使q减小的操作应尽量靠后。
    对于方案中的第一个使q减小的测试,其实可以将其调换到最后面的没有进行进行测试的一个位置。
    不断执行上面的调换,直到该位置后面所有的都进行了测试。
    该调换不会使得结果变小,只会使得结果更优。
    最终会形成一个后缀。在后缀中,无论 a [ i ] a[i] a[i] 的大小,都进行测试。
    前面的部分,只有不会使q减小的进行测试。
    最优方案应该使后缀尽量长。所以可以二分求解。

    Two

    逆向思考:假如q初始为0
    为了让 会使q变小的测试尽量排在后面,
    逆序遍历,如果 a [ i ] > q a[i] > q a[i]>q, q++。直到q 等于输入中q的值。
    这之后,前面的只有 a [ i ] ≤ q a[i] \leq q a[i]≤q 才进行测试。

    Code

    这是方法一的代码(方法二代码很简单,就不写了)

    bool check(int mid)
    {
    	int qq = q;
    	for (int i = mid; i <= n; i++)
    		if (a[i] > qq) qq--;
    
    	return qq >= 0;
    }
    
    int main()
    {
    	IOS;
    	int T; cin >> T;
    	while (T--)
    	{
    		cin >> n >> q;
    		for (int i = 1; i <= n; i++) cin >> a[i];
    		
    		int l = 1, r = n;
    		while (l < r)
    		{
    			int mid = l + r >> 1;
    			if (check(mid)) r = mid;//mid应该尽量小
    			else l = mid + 1;//mid太小了,导致check中qq < 0
    		}
    		for (int i = 1; i <= n; i++)
    			if (i < l) cout << (a[i] <= q ? 1 : 0);
    			else cout << 1;
    		cout << "\n";
    	}
    
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
  • 相关阅读:
    【JavaEE初阶】 CSS的引入方式和选择器
    redis---分布式锁存在的问题及解决方案(Redisson)
    语音转文字怎么转?分享这些实用软件
    CesiumJS 2022^ 源码解读[7] - 3DTiles 的请求、加载处理流程解析
    【第64篇】SMILEtrack:基于相似度学习的多目标跟踪
    Mysql优化---锁机制、行锁及表锁
    LeetCode高频题34. 在排序数组中查找元素的第一个和最后一个位置
    Idea快捷键
    小白也能看懂的 ROC 曲线详解
    [Spring实战] 整合Spring/SpringMVC/Mybatis(SSM)实现登录功能(带前端)
  • 原文地址:https://blog.csdn.net/QQ2530063577/article/details/125901509
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号