BZOJ 3119 Book (贪心+数学推导)

手动博客搬家: 本文发表于20191029 22:49:41, 原地址https://blog.csdn.net/suncongbo/article/details/78388925

URL: http://www.lydsy.com/JudgeOnline/problem.php?id=3119

题目大意:
给定一个序列v[]的长度n (n<=1e5), 第一个元素的值p以及序列中所有元素的和m (m在long long范围内), 规定对于任意的2<=i<=n, 都有v[i]=v[i-1]+a或v[i]=v[i-1]-b, 同时给定a,b, 确定一组可能的v[]至并输出。

思路分析:
为了方便起见,先将b变为输入数的相反数(即变为一个负数)。
首先,考虑初始值x造成的影响: 它使得1至n的序列所有元素增加了x, 因此可以将这个值剔除,这样和变成了\(m-np\).
其次,考虑第i个元素的值v[i]=v[i-1]+a造成的影响: 它使得i至n的序列中所有元素增加了a,使总和增加了\((n+1-i)a\).
同理可得,若v[i]=v[i-1]+b (b为负数)则使总和增加了\((n+1-i)b\)
在这里,我们称这次赋值对总和产生了\((n+1-i)\)点影响。
显然,所有的赋值对总和一共产生了\(\sum_{i=2}^n (n+1-i)=\sum_{i=1}^{n-1} i=\frac{1}{2}n(n-1)\)点影响。设其中+a产生的影响为x点,+b产生的影响为y点。由刚才的结论得:\[x+y=\frac{1}{2}n(n-1)\]\[xa+yb=m-nx\]
解二元一次方程组可得\[x=\frac{1}{2}n(n-1)-y\]\[y=\frac{\frac{1}{2}an(n-1)-m+np}{a-b}\]
于是只需构造方案即可。这一步比较简单。可以用贪心来实现。
我们的目标是在1至n得正整数范围内找到一些互不相同数使得他们的和恰好是x,其余的数的和恰好是y, 因为\(x+y=\frac{1}{2}n(n-1)\).因此,我们只需选出和为x的部分。考虑到\[1=1\]\[2=2, 3=2+1\]\[4=3+1, 5=3+2, 6=3+2+1\]\[7=4+3, 8=4+3+1, 9=4+3+2, 10=4+3+2+1\]\[...\]
注:第i行能用的最大的数是i.
因此,我们得到一种贪心策略: 从n开始,从大到小依次选择,如果剩余的x能够选上i就选,并且x-=i, 直至x==0为止,剩余的就是y.
若为x, 则v[i]=v[i-1]+a; 否则v[i]=v[i-1]+b (b<0)
但由于对总和产生了i点影响的是(n+i-1)号决策,因此输出时勿忘倒着输出。

代码实现:
(Memory: 920KB; Time: 376MS; Code: 614B)

#include<cstdio>
using namespace std;
const int MAXN = 1e5;
bool inc[MAXN+2];
int main()
{long long a,b,x,y,m,n,p;scanf("%lld%lld%lld%lld%lld",&n,&p,&a,&b,&m);b = -b;y = (a*n*(n-1)/2-m+n*p)/(a-b);x = n*(n-1)/2-y;long long cur = p;for(long long i=n-1; i && x; i--){if(x>=i){inc[i] = true;x-=i;}}printf("%lld",cur);for(long long i=n-1; i; i--){if(inc[i]) cur+=a;else cur+=b;printf(" %lld",cur);}return 0;
}

发表于 2018-12-26 22:51 suncongbo 阅读(...) 评论(...) 编辑 收藏

刷新评论刷新页面返回顶部

BZOJ 3119 Book (贪心+数学推导)相关推荐

  1. 【机器学习基础】数学推导+纯Python实现机器学习算法25:CatBoost

    Python机器学习算法实现 Author:louwill Machine Learning Lab 本文介绍GBDT系列的最后一个强大的工程实现模型--CatBoost.CatBoost与XGBoo ...

  2. 数学推导+纯Python实现机器学习算法:GBDT

    Datawhale推荐 作者:louwill,Machine Learning Lab 时隔大半年,机器学习算法推导系列终于有时间继续更新了.在之前的14讲中,笔者将监督模型中主要的单模型算法基本都过 ...

  3. 数学推导+纯Python实现机器学习算法:逻辑回归

    2019独角兽企业重金招聘Python工程师标准>>> 自本系列第一讲推出以来,得到了不少同学的反响和赞成,也有同学留言说最好能把数学推导部分写的详细点,笔者只能说尽力,因为打公式实 ...

  4. 详解CAPM的数学推导

    详解CAPM的数学推导 资本配置线 最优投资组合 市场投资者与资本资产定价公式 今年居然是咱本命年啊,难怪从二月开始就总是遇到各种奇奇怪怪的bug,不管怎么说还是祝我生日快乐吧.虽说已经不搞金融了,但 ...

  5. 机器学习——线性回归数学推导

    文章目录 线性回归数学推导 基础知识 线性回归的计算 利用矩阵知识对线性公式进行整合 误差项的分析 似然函数的理解 矩阵求偏导 线性回归的最终求解 实验 1 二维直线实验 2 三维平面实验 3 利用最 ...

  6. Lucene学习总结之六:Lucene打分公式的数学推导

     Lucene学习总结之六:Lucene打分公式的数学推导 在进行Lucene的搜索过程解析之前,有必要单独的一张把Lucene score公式的推导,各部分的意义阐述一下.因为Lucene的搜索 ...

  7. 【机器学习基础】数学推导+纯Python实现机器学习算法30:系列总结与感悟

    Python机器学习算法实现 Author:louwill Machine Learning Lab 终于到了最后的总结.从第一篇线性回归的文章开始到现在,已经接近有两年的时间了.当然,也不是纯写这3 ...

  8. 【机器学习基础】数学推导+纯Python实现机器学习算法24:HMM隐马尔可夫模型

    Python机器学习算法实现 Author:louwill Machine Learning Lab HMM(Hidden Markov Model)也就是隐马尔可夫模型,是一种由隐藏的马尔可夫链随机 ...

  9. 【机器学习基础】数学推导+纯Python实现机器学习算法28:CRF条件随机场

    Python机器学习算法实现 Author:louwill Machine Learning Lab 本文我们来看一下条件随机场(Conditional Random Field,CRF)模型.作为概 ...

最新文章

  1. Python 写了一个网页版的「P图软件」,惊呆了!
  2. 线性代数之矩阵标准型的求法
  3. (译)如何使用GameCenter制作一个简单的多人游戏教程:第一部分
  4. 奇闻异事之NoSuchMethodError
  5. BZOJ1016 [JSOI2008]最小生成树计数
  6. 知识图谱前端插件_前端学习曲线原来越陡,说说我的学习经历
  7. CentOS上使用sysstat做系统监控测试
  8. 自动点击器如何设置最快_微视APP如何设置自动播放视频-微视APP设置自动播放视频的方法...
  9. DXUT框架剖析(6)
  10. android把2变成02_【Android】学习札记第2章之数组二(Arrays工具类)
  11. 切换无线网卡失败服务器提示,Win7系统切换usb无线网卡为AP模式时提示ICS启动失败如何解决...
  12. 基于分解的MOEA的理解
  13. 武汉农商行 商转公所需材料
  14. candence与matlab电路仿真,电力电子电路仿真:MATLAB和PSpice应用
  15. Object.prototype.__proto__ 、Object.prototype和 Object.prototype.constructor
  16. SpringBoot之RMI的简单使用
  17. 教学管理系统-实验四 顺序图
  18. 6. 聚类算法之K-Means
  19. Python的对象和类型
  20. Django搭建个人博客:用django-notifications实现消息通知

热门文章

  1. 划重点!通俗解释协方差与相关系数
  2. 台湾大学林轩田机器学习基石课程学习笔记5 -- Training versus Testing
  3. matlab神经网络2:数据拟合
  4. nhibernate处理多数据库
  5. powerdesigner自动生成代码的修改
  6. Delphi动态数组详解
  7. Delphi 与C系列区别之已见(一)
  8. Java 接口interface
  9. c语言那些细节之a+1和a+1的区别
  10. Shiro集成SpringBoot时出现 not eligible for auto-proxying