UVa1614

2023-11-06

这道题是一道好题,我想了很久都没有想出合适的方案,这道题考了我们贪心(不确定)+数学推导(确定)的能力,看来我的数学逻辑以及推理能力还需要加强啊。

题意不说,直接上思路:

由于1<=ai<=i的条件,我们需要从这里入手求解,首先,我们需要证明什么时候优解,什么时候没解,解决这些再讨论怎么解的问题。

结论:对于在1 <= a[i] <= i时, 前i个数一定可以凑出1~sum[i]的所有整数

证明:数学归纳,n=1时成立,假设n=k之前所有项都成立,当n=k+1时。sum[k+1]=sum[k]+a[k+1]。
        只需证明能凑出sum[k]+1~sum[k+1]间的整数即可。设1≤p≤a[k+1],sum[k]+p=sum[k]+a[k+1]-(a[k+1]-p)。
        因为1≤a[i]≤i,易得sum[k]≥k,a[k+1]-p≤k。又因为已知前k个数可以凑出1~sum[k],所以一定可以凑出a[k+1]-p。
        所以只需从之前凑出sum[k]里面剪掉凑出a[k+1]-p的数就可以凑出sum[k]+p。所以从1~sum[k+1]都可以凑出。

https://www.cnblogs.com/zyb993963526/p/6357777.html

这个是从别人的博客上面找到的,这个大家自行理解,我就不说了。

然后是如何求解的问题,下面是解决思路:

我们把sum除2,然后就可以随便选了啊(从后往前选),只要a[i]的值小于当前sum值,我们就选了,赋值成1;否则赋值为-1;

我看有的题解要排序,其实不需要,排序无非是从大到小取...我反正觉得意义不大...

https://www.cnblogs.com/fzfn5049/p/7825185.html

这个大家看一看,我看到这个部分时,会有疑惑,为什么这样能够求出解呢?到底需不需要排序呢?????

经过思考后,我明白了这样解的正确性,并且知道不需要排序,为什么?

下面是证明:

当sum < a[i]时,我们不能够用sum = sum - a[i],目的也很简单(我们不能够得到负数,如果是负数,就不能保证得到的正负数的绝对值恰好是一半了),

那么我们需要确定i之前(即1 - i-1)是否满足它们的和 >= sum,由于a[i] <= i, a[1]+a[2]+...+a[i-1]>=i-1, 如果sum<a[i]那么sum<i所以我们发现a[1]+a[2]+...+a[i-1]>=sum,

类比最上面的结论(数学归纳的那部分)我们可以得到1 - i-1这部分一定能够组成sum,所以放心的继续向下查找。

当sum>=a[i]时,我们让sum = sum-a[i],其实证明与sum<a[i]的那部分类似,在-a[i]之前sum一定<=a[1]+a[2]+...+a[i-1](想一想,为什么),所以两边同时减去a[i],

自然也能够保证1 - i-1这部分一定能够组成sum-a[i],所以减完以后也放心的向下查找。

下面是实现:

// UVa 1614
// 数学证明(贪心) 
#include <cstdio> 
#include <cstring> 
#include <algorithm>
using namespace std; 

const int maxn = 100000 + 10; 
int n, a[maxn], ans[maxn];  

int main() { 
  while (scanf("%d", &n) == 1) {
    long long sum = 0; 
    for (int i = 0; i < n; ++i) {
      scanf("%d", &a[i]); 
      sum += a[i]; 
    }
    if (sum&1) {
      printf("No\n");    
    } else {
      printf("Yes\n"); 
      memset(ans, 0, sizeof(ans));
      sum >>= 1;  
      for (int i = n-1; i >= 0; --i) 
        if (sum >= a[i]) {
          sum -= a[i]; 
          ans[i] = 1; 
        } 
      for (int i = 0; i < n; ++i) {
        if (ans[i] == 0) printf("1 "); 
        else printf("-1 ");   
      }
      printf("\n");
    }
  }
  return 0;
}

 

转载于:https://www.cnblogs.com/yifeiWa/p/11249887.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UVa1614 的相关文章

  • C语言/C++实现栈操作

    一 栈的概念 栈是一种常用的数据结构 它遵循先入后出 Last In First Out LIFO 的原则 栈的操作只在栈的一端进行 该端被称为栈顶 而另一端称为栈底 栈的基本操作包括压栈 入栈 push 和弹栈 出栈 pop 分别用于将元
  • 数据库多维迭代算法

    关键词 数据库 迭代 递归 多维 一 两种传统的数据库迭代结构算法 对于数据库的迭代结构 有两种传统的算法 递归算法和边界算法 比如对于下面图1的结构 图1 递归算法的数据结构如表1所示 节点id 节点值 父节点id 1 1111 2 3
  • 直线检测方法—LSD论文翻译

    附原文链接 LSD a Line Segment Detector 摘 要 LSD是一个线段检测器 能够在线性时间内得到亚像素级精度的检测结果 它无需调试参数就可以适用于任何数字图像上 并且能够自我控制错误数量的检测 平均来说 一个图像中允
  • 微软2013暑假实习生笔试题

    自己mark一下 以作后备 下面提交原文链接 原文博客 部分题目答案不确定 会持续更新 1 Which of the following calling convention s support s supportvariable leng
  • 数据结构与算法学习总结(六)——字符串的模式匹配算法

    基本概念 字符串是一种特殊的线性表 即元素都是 字符 的线性表 字符是组成字符串的基本单位 字符的取值依赖于字符集 例如二进制的字符集为0 1 则取值只能为 0 1 再比如英语语言 则包括26个字母外加标点符号 例如 abcde 就是一个字
  • 亚利桑那州立大学周纵苇:研习 U-Net ——现有的分割网络创新

    雷锋网AI研习社按 经典的 Encoder Decoder 结构在目标分割问题中展现出了举足轻重的作用 然而这样一个相对固定的框架使得模型在感受野大小和边界分割精度两方面很难达到兼顾 本次公开课 讲者以 U Net 为案例分析 总结现有的分
  • 如何根据链表节点数据大小对链表节点进行排序

    对链表排序有两种方法 1 比较了两个节点的大小后 对指针进行改变 从而交换节点的顺序 2 比较了两个节点的大小后 只交换数据域 而不改变指针 从而交换节点的顺序 第二种办法比较简单 本文主要对第二种方法进行讲解 链表节点排序算法 采用 冒泡
  • Python 实现列队

    1 列队定义 队列是项的有序结合 其中添加新项的一端称为队尾 移除项的一端称为队首 当一个元素从队尾进入队列时 一直向队首移动 直到它成为下一个需要移除的元素为止 最近添加的元素必须在队尾等待 集合中存活时间最长的元素在队首 这种排序成为
  • 算法系列15天速成——第八天 线性表【下】

    一 线性表的简单回顾 上一篇跟大家聊过 线性表 顺序存储 通过实验 大家也知道 如果我每次向 顺序表的头部插入元素 都会引起痉挛 效率比较低下 第二点我们用顺序存储时 容 易受到长度的限制 反之就会造成空间资源的浪费 二 链表 对于顺序表存
  • 以太坊系列之十五: 以太坊数据库

    以太坊数据库中都存了什么 以太坊使用的数据库是一个NOSQL数据库 是谷歌提供的开源数据leveldb 这里尝试通过分析以太坊数据库存储了什么来分析以太坊可能为我们提供哪些关于区块链的API 存储内容 NOSQL是一个key value数据
  • 链表面试题(一):反转链表的算法实现

    关于链表的考察 链表是面试里面经常涉及到的考点 因为链表的结构相比于Hashmap Hashtable Concurrenthashmap或者图等数据结构简单许多 对于后者更多面试的侧重点在于其底层实现 比如Hashmap中Entry
  • Unique Binary Search Trees -- LeetCode

    原题链接 http oj leetcode com problems unique binary search trees 这道题要求可行的二叉查找树的数量 其实二叉查找树可以任意取根 只要满足中序遍历有序的要求就可以 从处理子问题的角度来
  • 浮生六记

    浮生六记 目录 浮生六记卷一 闺房记乐 002 浮生六记卷二 闲情记趣 015 浮生六记卷三 坎坷记愁 022 浮生六记卷四 浪游记快 034 浮生六记 2 浮生六记卷一 闺房记乐 余生乾隆癸未冬十一月二十有二日 正值太平盛世 且在 衣冠之
  • 算法学习——贪心算法之币种统计

    算法描述 币种统计 单位给每一位员工发工资 精确到元 为了保证不临时换零钱 使得每个员工取款的张数最少 在取工资前统计所有员工所需要的各种票面的张数 约定票种为100 50 20 10 5 2 1元 并验证币种统计是否正确 算法思路 算法描
  • OJ-合并两个有序链表

    题目描述 代码如下 Definition for singly linked list struct ListNode int val struct ListNode next struct ListNode mergeTwoLists s
  • 用指针访问一维数组

    文章目录 顺序查找 数组方式实现 指针实现方式 对一位数组元素的访问有三种方式 指针变量的关系运算 引例 数组实现方式 主函数 指针实现方式 主函数 一维数组作为函数的参数 实际应用 顺序查找 要求用指针实现 在整数集合r中顺序查找与给定值
  • 查找数组中第二大的数

    快速找出一个数组中的最大数 第二大数 思路 如果当 前元素大于最大数 max 则让第二大数等于原来的最大数 max 再把当前元素的值赋给 max 如果当前的元素大于等于第二大数secondMax的值而小于最大数max的值 则要把当前元素的值
  • 用两个栈实现队列

    目录 一 栈的基本结构及其接口 二 我的队列结构定义 三 我的队列创建及其初始化 四 我的队列入队 五 我的队列出队 六 我的队列取队头元素 七 我的队列判空 八 我的队列销毁 一 栈的基本结构及其接口 栈的结构定义 typedef int
  • 牛客剑指offer刷题其他算法篇

    文章目录 构建乘积数组 题目 思路 代码实现 第一个只出现一次的字符
  • C++ AVL树(四种旋转,插入)

    C AVL树 四种旋转 插入 一 AVL树的概念及性质 二 我们要实现的大致框架 1 AVL树的节点定义 2 AVL树的大致框架 三 插入 1 插入逻辑跟BST相同的那一部分 2 修改平衡因子

随机推荐

  • request.getScheme() 使用方法

    今天在看代码时 发现程序使用了 request getScheme 不明白是什么意思 查了一下 结果整理如下 1 request getScheme 返回当前链接使用的协议 一般应用返回http SSL返回https 2 在程序中的应用如下
  • 电脑文件误删除恢复的解决办法

    有时候我们常常会头脑发热 把电脑中的一些重要文件不小心删除了 比如一些重要的图片或者文档 甚至还把回收站给清空了 怎么才能将误删除的文件找回来呢 可能大家会马上百度 会看到乱七八糟的找回误删除文件的方法 这些方法无非几种情况 1 软件下载下
  • 电脑ftp服务器信息,电脑上的ftp信息服务器地址

    电脑上的ftp信息服务器地址 内容精选 换一换 通常园区视频功能主要集中在存储和查看 视频分析和态势感知能力较弱 通过使用智能边缘平台与视频分析服务 提升视频分析和感知能力 实现智慧园区人脸识别检测功能 本实践需要使用到视频分析服务的边缘人
  • EXCEL中TEXTJOIN 函数的使用*

    EXCEL中TEXTJOIN 函数的使用 函数说明 textjoin 文本合并函数 函数组成 textjoin 分隔符 忽略空白单元格 字符串1 字符串2 字符串253 示例 需要将需要将左边的表格样式转换成右边的样式 操作步骤 1 将A列
  • Tensorflow2.x模型搭建的几种代码形式

    相信很多新手小白在才开始初学时就想要搭建自己的深度学习模型 但在看到每个风格不同的算法时 又会把前向传播 反向传播 和模型的搭建过程混淆 我总结了一下几种基于Tensorflow2 x搭建模型的代码 1 学习过程中最常见的数据切片 载入并预
  • cpu温度过高 ubuntu_联想拯救者Y7000P温度过高?Fn+Q配合XTU做温度和功耗测试

    Y7000P温度过高 Fn Q配合XTU做温度和功耗测试 国庆节入手Y7000P 机子很稳定 但是打大型游戏温度动辄90 以上 经常撞到95 温度墙 为了降低游戏中的温度 做了以下测试 Y7000P的i5 9300H功耗墙60W 78W 温
  • ecology9 系统文件常用说明

    这里写目录标题 数据库文件 操作异构系统数据库 白名单文件 日志框架的使用 数据库文件 D WEAVER ecology WEB INF prop weaver properties 操作数据库 public static void mai
  • golang - 函数的使用

    核心化编程 为什么需要函数 代码冗余问题 不利于代码维护 函数可以解决这个问题 函数 函数 为完成某一功能的程序指令 语句 的集合 称为函数 在 Go 中 函数分为 自定义函数 自己写的 系统函数 系统提供的 函数的定义 基本语法 func
  • 基于空间平滑MUSIC算法的相干信号DOA估计(1)

    空间平滑MUSIC算法 1 1 前言 在上一篇博客中有提到 当多个入射信号相干时 传统MUSIC算法的效果就会不理想 具体原因是多个入射信号相干时 有部分能量就会散发到噪声子空间 使得MUSIC算法不能对其进行有效估计 针对这种情况 解相干
  • Qt 的网络通信(TCP)

    基于TCP Qt的网络通信 在标准 C 没有提供专门用于套接字通信的类 所以只能使用操作系统提供的基于 C 的 API 函数 基于这些 C 的 API 函数我们也可以封装自己的 C 类 但是Qt 提供了封装好的套接字通信类 QTcpServ
  • 史上超强最常用SQL语句大全

    史上超强最常用SQL语句大全 DDL Data Definition Language 数据定义语言 一 操作库 二 操作表 DML Data Manipulation Language 数据操作语言 一 增加 insert into 二
  • 性能测试调优应该注意哪些要点,一般性能测试调优的步骤-Alltesting

    性能测试调优应该注意的要点 要点1 在应用系统的设计开发过程中 应始终把性能放在考虑的范围内 要点2 确定清晰明确的性能目标是关键 要点3 必须保证调优后的程序运行正确 要点4 系统的性能更大程度上取决于良好的设计 调优技巧只是一个辅助手段
  • steam上wallpaper静态壁纸如何提取高清图

    mirrors notscuffed repkg GitCode 将壁纸资源文件打开 把sene pkg与两个文件放在同目录下在 打开终端输入 RePKG exe extract scene pkg 目录下找到 output materia
  • map reduce takeaways

    首先是数据的partition share nothing parallel architecture 执行task的machine独立 各自处理自己的partition 不需要通信 暴露给用户的控制点只有2个 map function 和
  • 基于51单片机的水箱水位监测控制系统proteus仿真原理图PCB

    功能介绍 0 本系统采用STC89C52作为单片机 1 通过传感器监测水位 当水位低于水位下限时 接通加水水泵 直到水位达到水位上限 停止加水 2 水位低于水位下限时 声光报警 3 可按键手动加水 直到水位达到水位上限 停止加水 4 采用D
  • Axure基础:母版与内联框架

    一 母版 1 母版的作用 母版是解决了我们页面中的重复元素和同步改动的问题 举个例子在两个页面中假设都有这个元素和界面 那我如果我们不用母版 用常规手段就是复制黏贴 但这样没办法保证我们数据同步问题 如果改动其中一个元件 另一个元件没办法同
  • 陀螺解读

    出品 陀螺研究院 区块链是在数字世界围绕数据的记录 组织和传播创造的共建 共享 共治的应用范式 作为一种能够满足数字经济发展需求的关键技术 区块链可有效赋能产业转型 聚力推动产业经济价值 2019年10月24日 中共中央政治局明确把区块链作
  • 马氏距离-Mahalanobis Distance

    Mahalanobis距离是表示数据的协方差距离 它是一种有效的计算两个未知样本集的相似度的方法 与欧氏距离不同的是它考虑到各种特性之间的联系 与欧氏距离不同的是它考虑到各种特性之间的联系 例如 一条关于身高的信息会带来一条关于体重的信息
  • IDEA生成JSON字符串

    第一步 先书写以下基本程序 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 package cn lianxi cn lianxi json Author Wxz Date 2020 8 19 16 45 pu
  • UVa1614

    这道题是一道好题 我想了很久都没有想出合适的方案 这道题考了我们贪心 不确定 数学推导 确定 的能力 看来我的数学逻辑以及推理能力还需要加强啊 题意不说 直接上思路 由于1 lt ai lt i的条件 我们需要从这里入手求解 首先 我们需要