码迷,mamicode.com
首页 > 其他好文 > 详细

【整理】最近做的几道数学题

时间:2015-05-26 23:07:55      阅读:476      评论:0      收藏:0      [点我收藏+]

标签:

数学题也是有意思 那么总结一下

 

T1.【Bzoj2751】【HAOI2012】容易题

题意

有一个数列A已知对于所有的A[i]都是1~n的自然数,并且知道对于一些限制即A[i]不能取哪些值,我们定义一个数列的积为该数列所有元素的乘积,求出所有可能的数列的积的和。

题解

考虑一个式子(...)(...)(...),()内为一些数相加,根据乘法分配律,打开这个式子就是每次从每个括号中选一个元素,再把所有可能选择的结果加起来。

这件事情就是我们题目的设问,于是我们只要算出来每个位置sigma可能的选择,再乘起来就行了。

具体的实现中,因为很多位置没有限制,于是这些快速幂解决;有限制的做减法。

用到的就是小学生都知道的知识,感觉小时候玩式子玩得还是不够多啊!反应不够快!

“公式的逆”这种解题模型应该是很常见的。

 

T2.【Bzoj3142】【HNOI2013】数列

题意

有一个长度为m的严格递增正整数数列,规定相邻两项差值<=k,且末项<=n,并且有m(k-1)<n,求可能的数列个数。

题解

不难想到考虑数列两项的差值(设a[i]代表i项与前一项差),且因为m(k-1)<n所以差值可以随便选(不过当然不超过k)都不会选挂。

那么每一个差值序列对于答案的贡献也就是(n-sigma a[i])。

考虑暴力的方法,也就是枚举每一个a[i],然后按上面那个公式计算。

因为最后答案是由各数列累加,n的贡献可以直接来,关键是a[i],也就是我们可以分开算a[i]每个取值的贡献。

显然1~k这些数被选作a[i]概率相等,我们也知道a[i]被选总数,由此得出每个数被选次数。

我们也知道1~k的和,所以贡献就是sigma(1~k)*每个数被选次数。

具体的数值自己push吧。

 

T3.【Bzoj1110】【POI2007】砝码Odw

题意

n个物品,m个背包,大小都由输入给定,有一个条件n个物品任意两个有倍数关系,也可能相等,求最多能放多少物品。

题解

其实这道题和数学好像关系不大,主要是倍数关系比较神奇。

因为都存在倍数关系,那么大小物品之间是可以相互转换的。

从大到小,直接拆就可以了;从小到大,数量要够且要在一个背包中。

由此看来,从大到小比从小到大高明多了。

于是贪心,拆所有的背包,能拆成大物品就拆成大物品。比如背包19,物品8、4、2,就拆成8*2+2(拆完8后4放不进,最后的1没用)。

在此贪心,因为只要求个数,先放小的肯定比放大的好。

考虑的时候用拿个背包并不重要(这也就是拆大的高明之处),所以m个背包一起考虑(就是把每个物品在各个背包的系数加起来)。

如果当前物品系数不够,考虑上面的分析过程,把大的拆成小的就可以了。

因为是倍数,且大小在10^9内,就算每次*2,也只可能有30不同物品,于是怎么实现都可以了。

以上是我口胡的方法,比较正规的说法是,把背包看做一个奇怪的进制(倍数关系),然后拆大就是借位。

 

接下来两道题Orz叉姐

如此神奇的模型转换我怎么想得到呢

于是直接copy题解供大家欣赏好了

 

T4.【POJ 3244】Difference between Triplets

题意

定义两个三元组I(xi,yi,zi)和J(xj,yj,zj) (可以看做是空间中的点)
他们的距离为D(I,J)=max{xi-xj,yi-yj,zi-zj}-min{xi-xj,yi-yj,zi-zj}
给定n个三元组(n<=200000),求任意两个三元组的差的和

题解
抽化出来的模型是 max(a,b,c)-min(a,b,c),这个东西吧他放在数轴上 a,b,c
我们要求最大和最小的差就是这三个点构成的线段的距离,那么我们这里再变通下 是不是端点到中间那个点的距离
其实画出这个图的时候,就可以看到这个距离为(|a-b|+|b-c|+|c-a|)/2,这样我们并不需要关心中间的那个//也就是线段的长度
对应到题目中的原型,就是(|(xi-xj)-(yi-yj)|+|(yi-yj)-(zi-zj)|+|(zi-zj)-(xi-xj)|)/2;
对应到同一个点上就是(|(xi-yi)-(xj-yj)|+|(yi-zi)-(yj-zj)|+|(zi-xi)-(zj-xj)|)/2;
设a=(xi-yi),b=(yi-zi),c=(zi-xi),原问题等价为(|ai-aj|+|bi-bj|+|ci-cj|)/2;
然后三个可以完全分开完全独立的计算,并不影响其他两元,这里要加个优化,就是按从小到大排序出来
我们只需要算出每个位置上,他贡献了多少次加法,贡献了多少次减法即可
举个例子,目前把a的部分排序了,对于第i个,他前面的比它小,所以在和i点比较时i点贡献了i次加法,对后面的n-i个点向他们做了n-i次减法

 

T5.【POJ 2595】Min-Max

题意

设函数F(x1,x2...xn)=Σuixi(1<=i<=n),u为函数固定的系数,且对u有限制Σu=1且u∈[0,1],但是你不知道,你只知道一组输入x1,x2...xn对应的输出为C,问题是给定的另一组输入y1,y2...yn的输出最小与最大可能是多少。
题解

观察一下u的神奇范围我们可以很直观的联想到一群质点的重心公式,不妨将(xi,yi)作为坐标放在平面直角坐标系中,我们就可以将所有的有序实数对看成质量相等的质点,C就是其重心的x坐标,答案即为重心的y坐标,由重心知识可知重心位于点集的凸包内部,所以贪心得到答案为凸包边(点)上,所以求出凸包维护一下答案就行了。

【整理】最近做的几道数学题

标签:

原文地址:http://www.cnblogs.com/xkui/p/4531698.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!