首页 > 其他分享 >第二节 贪心

第二节 贪心

时间:2023-07-11 09:02:18浏览次数:31  
标签:le 样例 小信 异或 第二节 最优 贪心

引入


贪心算法(英语:greedy algorithm),是用计算机来模拟一个「贪心」的人做出决策的过程。这个人十分贪婪,每一步行动总是按某种指标选取最优的操作。而且他目光短浅,总是只看眼前,并不考虑以后可能造成的影响。

可想而知,并不是所有的时候贪心法都能获得最优解,所以一般使用贪心法的时候,都要确保自己能证明其正确性。

适用范围


贪心算法在有最优子结构的问题中尤为有效。最优子结构的意思是问题能够分解成子问题来解决,子问题的最优解能递推到最终问题的最优解。

证明


贪心算法有两种证明方法:反证法和归纳法。一般情况下,一道题只会用到其中的一种方法来证明。

  1. 反证法:如果交换方案中任意两个元素/相邻的两个元素后,答案不会变得更好,那么可以推定目前的解已经是最优解了。
  2. 归纳法:先算得出边界情况(例如 \(n\) = 1)的最优解 \(F_1\),然后再证明:对于每个 \(n\),\(F_{n+1}\) 都可以由 \(F_{n}\) 推导出结果。

题目练习


A. 异或与乘积

时间:1s 空间:256M

题目描述:

小信有 \(n\) 个数的序列 \(a_i\)。现在他想做若干次操作,每次选择两个数,把他们异或起来,之后删除这两个数,并把他们异或后的结果加入序列。

小信进行若干次操作后,会把序列中剩下的数全部乘起来。小信想知道最后的结果最大是多少。注意,小信最多操作 \(n−1\) 次,在这之后序列会只剩下一个数。

由于答案可能很大,输出对 \(1000000007\) 取模后的结果。

输入格式:

第一行包含一个整数 \(n\)。

第二行包含 \(n\) 个整数 \(a_i\)。

输出格式:

输出一行表示答案对 \(1000000007\) 取模后的结果。

样例1输入:

4
1 2 1 2

样例1输出:

9

样例2输入:

2
3 3

样例2输出:

9

样例3输入:

2
1 3

样例3输出:

3

约定:

有 \(30\%\) 的数据,\(2 \le n \le 5\), \(1 \le a_i \le 10^9\)。

对于 \(100\%\) 的数据,\(2 \le n \le 10^5\), \(1 \le a_i \le 10^9\)。

分析:

我们需要找到两个数 \(a_i\) ^ \(a_j\) > \(a_i\) * \(a_j\), 去进行异或操作才对整体有帮助。

经过一些简单数学思想可证, 这两个数需满足以下两个要求 :

  1. 有一个数为 1

  2. 另一个数为 偶数

标签:le,样例,小信,异或,第二节,最优,贪心
From: https://www.cnblogs.com/So-noSlack/p/17542842.html

相关文章

  • abc065d <贪心+最小生成树> [lambda表达式]
    D-Built?//https://atcoder.jp/contests/abc065/tasks/arc076_b//贪心+最小生成树//关键在于意识到,连接x或y相邻的边代价最小,因而无需考虑全部的边,仅需考虑这些相邻边即可(贪心)//学习://1.lambda写法https://www.cnblogs.com/yaya12138/p/11815475.html//......
  • abc064d <贪心/前缀和>
    D-Insertion另一种做法,注意这两种写法:max_elementstring(个数,字符)//https://atcoder.jp/contests/abc064/tasks/abc064_d//贪心//要求答案为字典序最小,因而补充的'('都放在最前面,')'都放在最后面//从左到右遍历,记录未匹配的左括号个数cntl,//当......
  • 贪心&&模拟&&搜索
    贪心基于微扰证明但关系不具有传递性的贪心感觉起了个离谱的标题先看题:P2123皇后游戏既然这题像国王游戏就顺着考虑微扰贪心,对于两个大臣\(i,j=i+1\),假设现在的顺序是最优顺序,那么记\(last=c_{i-1},sum=\sum_{k=1}^{i-1}a_k\)有:\[cost_1=max\{last+b_i,sum......
  • 5944: 小船过河 经典贪心
    描述  N个人要过河,但只有一条小船,每次只能坐2人,每个人有不同的划船速度,而两个人一起过河时小船速度由最慢的人的速度决定。请设计一个过河方案,使得所有人均过河,且所用总时间最少。   输入  第一行为正整数N(N<=1000),表示人数,第二行为N个正整数,表示每个人的速度(......
  • 第二节 Java基础语法
    day02-Java基础语法1.注释​ 注释是对代码的解释和说明文字。Java中的注释分为三种:单行注释://这是单行注释文字多行注释:/*这是多行注释文字这是多行注释文字这是多行注释文字*/注意:多行注释不能嵌套使用。文档注释(暂时用不到):/**这是多行注释文字这是......
  • YBTOJ 1.2贪心算法
    A.奶牛晒衣服......
  • 算法——暴力、贪心策略
    暴力贪心算法是一种基于贪心思想的算法,它的主要思想是在问题求解的过程中,尽可能地采取局部最优策略,从而得到全局最优解。暴力贪心算法的技巧包括:确定问题的最优解结构:对于一个问题,如果它具有最优子结构的性质,那么就可以使用贪心算法来求解。最优子结构的性质是指问题的最优解可......
  • 24.贪心算法.
    贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法。请看下面案例,假设有如下课程,希望尽可能多的将课程安排在一间教室里:课程开始时间结束时间美术9:0010:00英语9:3010:30......
  • Dreaming of Freedom(数论,贪心)
    用nsqrt(n)的时间复杂度就能过//DreamingofFreedom:https://codeforces.com/problemset/problem/1826/C#include<bits/stdc++.h>//#defineintlonglongusingnamespacestd;constintN=1e5+10,mod=1e9+7;strings;intn,t,a[N],f[N],res,num,ans,m;boolvis[N];i......
  • 基础算法:二分,贪心等 学习笔记
    普及组基础算法这些都是零零散散接触过的基础算法,写个笔记把这些整理到一起来。线性降维技巧之前在学校洛谷团队里看到一个题单,觉得这些技巧可能有用,就转存了。前缀和差分前缀和是一种对区间求和问题进行降维的方法。具体地,对于给定数组\(A[n]\),求出\(A[l,r]\)区间和这个......