2016级算法第四次上机-D.AlvinZH的1021实验plus
978 AlvinZH的1021实验plus
思路
贪心,中等题。
使用miss变量表示未覆盖的最小数字,初始值为1。
初始覆盖区间为[1,miss),目标是覆盖[1,m],即miss需要大于m。
需要比较miss和数组里没有使用的数字中最小的数字x(所以需要先给数组排序。
- miss更小:没有一个组合可以满足需要的值,需要插入该值,即插入miss,这时覆盖区间变成 \([1,miss<<1)\) 。
- miss更大:当前可以覆盖[1,miss),加上此值,覆盖区间变为 \([1,miss+x)\) 。
循环终止条件:miss > m。
以下是番外内容:
多位同学问我为什么WA,原因是没有看到砝码只能放在同一边,受到上一题的影响(助教窃笑,小伙子还是不够细啊。
还有同学问OJ是不是有问题,明明应该是WA却提示TLE,原因是数组数字在int范围内,miss可能会超过int,计组里面有讲到INT32_MAX+1会变成什么,答案是INT32_MIN,所以你的while相当于无限循环,不TLE才怪。
分析
本题的贪心在于,为了最快接近目标数m,每次都最大化覆盖范围。
再说一下贪心,贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。当然,希望贪心算法得到的最终结果也是整体最优的。虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解。如单源最短路经问题,最小生成树问题等。在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似。
参考代码一
//
// Created by AlvinZH on 2017/11/19.
// Copyright (c) AlvinZH. All rights reserved.
//
#include <cstdio>
#include <algorithm>
using namespace std;
int n, m;
int FM[1005];
int main()
{
while(~scanf("%d %d", &n, &m))
{
for (int i = 0; i < n; ++i)
scanf("%d", &FM[i]);
sort(FM, FM + n);
int ans = 0;
int pos = 0;
long long miss = 1;
while(miss <= m)
{
if(pos < n && FM[pos] <= miss) {
miss += FM[pos];
pos++;
}
else {
ans++;
miss <<= 1;
}
}
printf("%d\n", ans);
/* 简单替换
int ans = 0, pos = 0;
for (long miss = 1; miss <= m; ans++)
miss += (pos < n && FM[pos] <= miss) ? FM[pos++] : miss;
printf("%d\n", ans - pos);
*/
}
}
2016级算法第四次上机-D.AlvinZH的1021实验plus的更多相关文章
- 2016级算法第四次上机-C.AlvinZH的1021实验
975 AlvinZH的1021实验 思路 贪心,简单题. 题目已经说明有且只有一种方法表示所求数,简单列举几项可以发现只由前i个砝码会可以表示[1,∑Wi]的所有数的.先找到最大需要的砝码Wi,问题 ...
- 2016级算法第四次上机-F.AlvinZH的最“长”公共子序列
940 AlvinZH的最"长"公共子序列 思路 DP,难题. \(dp[i][j]\) :记录A的前i个字符与B的前j个字符变成相同需要的最小操作数. 初始化:dp[i][0] ...
- 2016级算法第四次上机-E.Bamboo and the Ancient Spell
Bamboo and the Ancient Spell 分析 可能英文读题难度比较大,但是只要看到全大写的 "THE LONGEST COMMON SUBSEQUENCE !"应 ...
- 2016级算法第四次上机-B ModricWang的序列问题
1019 ModricWang的序列问题 思路 此题题意非常清晰,给定一个序列,求出最长上升子序列的长度.从数据规模来看,需要\(O(nlogn)\) 的算法. \(O(nlongn)\) 求最长上升 ...
- 2016级算法第四次上机-G.ModricWang的序列问题 II
1021 ModricWang的序列问题II 思路 此题与上一题区别不是很大,只是增加了一个长度限制,当场通过的人数就少了很多. 大体解题过程与上一题相同.区别在于对\(f[]\) 的操作.没有长度限 ...
- 2016级算法第四次上机-A.Bamboo 和人工zz
Bamboo和人工ZZ 题意: 非常直白,经典的动态规划矩阵链乘问题 分析: 矩阵链A1A2..An满足结合律,可以使用加括号的方式,降低运算代价. 一个pq的矩阵和一个qr的矩阵相乘,计算代价为pq ...
- 2016级算法第六次上机-F.AlvinZH的学霸养成记VI
1082 AlvinZH的学霸养成记VI 思路 难题,凸包. 分析问题,平面上给出两类点,问能否用一条直线将二者分离. 首先应该联想到这是一个凸包问题,分别计算两类点的凸包,如果存在符合题意的直线,那 ...
- 2016级算法第五次上机-E.AlvinZH的学霸养成记IV
1039 AlvinZH的学霸养成记IV 思路 难题,最大二分图匹配. 难点在于如何转化问题,n对n,一个只能攻击一个,判断是否存在一种攻击方案我方不死团灭对方.可以想到把所有随从看作点,对于可攻击的 ...
- 2016级算法第六次上机-D.AlvinZH的学霸养成记V
1081 AlvinZH的学霸养成记V 思路 中等题,计算几何. 这是一个排序问题,按极角排序.可以转化为叉积的应用,对于点A和B,通过叉积可以判断角度大小,共线时再判断距离. 叉积的应用.OA × ...
随机推荐
- EasyBuy项目总结_20180409
一.项目技术点 1.熟练使用jsp及el和jstl表达式 el: $() jstl: 1.导包; 2.声明<%@ taglib uri=" " preffix="c ...
- Hbase-1.1.1-java API
1.工具类 package com.lixin.stuty.hbase; import java.io.IOException; import org.apache.commons.configura ...
- SqlServer——字符串处理函数
1) ASCII Format:ASCII ( character_expression ) Function:返回表达式最左端字符的ASCII值. eg: select ASCII('abcdef' ...
- [模板]割点(tarjan)
洛谷P3388 注意:记得tarjan的打法 注意割点的判断条件:子节点个数>2并且为根节点 当它不为根节点时并且low[to]>dfn[u] 判断时是在子节点未被记录的时候 #incl ...
- python 类变量 在多线程下的共享与释放问题-乾颐堂
最近被多线程给坑了下,没意识到类变量在多线程下是共享的,还有一个就是没意识到 内存释放问题,导致越累越大 1.python 类变量 在多线程情况 下的 是共享的 2.python 类变量 在多线程情况 ...
- Mybatis:传入参数方式以及#{}与${}的区别
一.在MyBatis的select.insert.update.delete这些元素中都提到了parameterType这个属性.MyBatis现在可以使用的parameterType有基本数据类型和 ...
- 斐波那契数列—java实现
最近在面试的时候被问到了斐波那契数列,而且有不同的实现方式,就在这里记录一下. 定义 斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
- [GO]channel实现数据交互
package main import ( "fmt" "time" ) func main() { ch := make(chan string)//创建ch ...
- 从零开始学习前端JAVASCRIPT — 8、JavaScript基础COOKIE
1:通信协议 定义:通信协议是指双方实体完成通信或服务所必须遵循的规则和约定.协议定义了数据单元使用的格式,信息单元应该包含的信息与含义,连接方式,信息发送和接收的时序,从而确保网络中数据顺利地传送到 ...
- js的常用方法
var Jade = {}; Jade.util = { addEvent: function (target, eventType, eventHandle, param) { //deal par ...