题意:

给出三个木棒的长度为aaa、bbb、ccc,再给出一个长度 lll 用来增加三根木棒的长度。三根木棒长度增加之和不能超过lll,可以为000。问有多少种增长方案使得这三根木棒可以拼成一个三角形。(1≤a,b,c≤3∗105,0≤l≤3∗105)(1\leq a,b,c\leq 3*10^5,0\leq l\leq 3*10^5)(1≤a,b,c≤3∗105,0≤l≤3∗105)


思路:

最简单的思路就是令xxx、yyy、zzz分别为aaa、bbb、ccc三根木棒的长度增加值。则 x+y+z≤lx+y+z \leq lx+y+z≤l,然后令 x+y+z=H (0≤H≤l)x+y+z = \text{H} \ (0\leq H\leq l)x+y+z=H (0≤H≤l),枚举 H\text{H}H,计算答案。

比赛时我的思路是正向求解这个问题,然后就可以列出下述的式子。
{x+y+z=Ha+x&lt;b+y+z+cb+y&lt;a+x+z+cz+c&lt;a+x+b+y\left\{ \begin{aligned} &amp; x+y+z = \text{H} \\ &amp; a+x &lt; b+y+z+c \\ &amp; b+y &lt; a+x+z+c \\ &amp; z+c &lt; a+x+b+y \\ \end{aligned} \right.⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧​​x+y+z=Ha+x<b+y+z+cb+y<a+x+z+cz+c<a+x+b+y​
于是问题就变成了一个线性规划问题,要求在线性规划区域中找到有多少个整点。然后就是不断的公式化简和推导,然后成功自闭…

其实推导到这个程度之后就应该及时调整解题方向,线性规划问题的难度是很大的,现在也没有比较好的通用方向进行解决。所以推导到线性规划之后就应该及时调转车头。

于是我们从反向入手,考虑一下容斥的思想。枚举H\text{H}H之后,计算有多少种方案使得木棒无法构成三角形。木棒无法构成三角形主要是因为 最长的木棒长度 &gt;&gt;> 剩下两个木棒长度相加。因此我们枚举哪一根木棒是最长的木棒。

假如枚举了木棒 aaa 为最长的木棒,则
{x+y+z=Ha+x&gt;b+y+c+z\left\{ \begin{aligned} &amp; x+y+z = \text{H} \\ &amp; a+x &gt; b+y+c+z \\ \end{aligned} \right.{​x+y+z=Ha+x>b+y+c+z​
可以得到 2∗x&gt;b+c+H−a2*x &gt;b+c+\text{H}-a2∗x>b+c+H−a,可以求出 x≥basex\geq basex≥base,于是只要给aaa分配的长度大于basebasebase,就一定不可以构成三角形,于是问题转化为 x+y+z=H−basex+y+z = \text{H}-basex+y+z=H−base 有多少种分配方案。

而所有的分配方案数为 x+y+z=Hx+y+z = \text{H}x+y+z=H 的方案数。于是问题转化成了a+b+c=za+b+c = za+b+c=z 有多少种不同的分配方案。

首先考虑 b+c=zb+c=zb+c=z 有多少种不同的分配方案数。很明显有 z+1z+1z+1 种分配方案,因此枚举 aaa,可以发现 a+b+c=za+b+c=za+b+c=z 的分配方案数为 (z+1)+z+(z−1)+...+1=(z+1)∗(z+2)2(z+1)+z+(z-1)+...+1 = \frac{(z+1)*(z+2)}{2}(z+1)+z+(z−1)+...+1=2(z+1)∗(z+2)​。当然也可以直接用组合数来求取答案,用隔板法可以得到总方案数为 C(z+2,2)C(z+2,2)C(z+2,2),至此本题即可解决。


反思:

首先总结一下常见的几个数学思维。
① 正难则反 —— 容斥思想、反演思想
② 变量思想 —— 设出未知量再不断进行方程化简,寻找规律

再总结一下此类数学思维题的一些经验。
① 一道题拿到手上之后,一定要对问题不断进行抽象化简,不断地深入思考,抽丝剥茧,逐层深入,才有可能能够解决这个问题。
② 要擅长去找到规律,从小例子上找到思路然后放到大例子上进行解决。

一个数学式子记录。
a+b+c=z,za+b+c = z,za+b+c=z,z 为常数,一共有 C(z+2,2)C(z+2,2)C(z+2,2) 种 <a,b,ca,b,ca,b,c> 分配方案。


代码:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#define __ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define rep(i,a,b) for(int i = a; i <= b; i++)
#define LOG1(x1,x2) cout << x1 << ": " << x2 << endl;
#define LOG2(x1,x2,y1,y2) cout << x1 << ": " << x2 << " , " << y1 << ": " << y2 << endl;
#define LOG3(x1,x2,y1,y2,z1,z2) cout << x1 << ": " << x2 << " , " << y1 << ": " << y2 << " , " << z1 << ": " << z2 << endl;
typedef long long ll;
typedef double db;
const int N = 1e5+100;
const int M = 1e5+100;
const db EPS = 1e-9;
using namespace std;int a,b,c,l;
ll ans;ll calc(ll a1,ll len){ll tp = ((a1+a1+len-1ll)*len)/2ll;return tp;
}ll solve(int a1,int b1,int c1,int len){ll tp = ceil((b1+c1+len-a1)/2.0-0.1);    tp = max(0ll,tp);len -= tp;// LOG1("len",len);if(len < 0) return 0;ll hp = calc(1,len+1);return max(0ll,hp);
}int main()
{scanf("%d%d%d%d",&a,&b,&c,&l);rep(i,0,l){ll tp1 = max(0ll,calc(1,i+1));// LOG2("i",i,"tp1",tp1);ll tp2 = 0;tp2 += solve(a,b,c,i);// LOG1("tp2",tp2);tp2 += solve(b,a,c,i);// LOG1("tp2",tp2);tp2 += solve(c,a,b,i);// LOG1("tp2",tp2);ans += tp1-tp2;}printf("%lld\n",ans);return 0;
}

【Codeforces Round #317 Div1 —— A】Lengthening Sticks【数学思维题】相关推荐

  1. Educational Codeforces Round 67 (Rated for Div. 2)(D思维题 线段树/E树形dp(换根dp) 二次扫描与换根法)

    心得 D写了个假算法被hack了wtcl- E据涛神说是二次扫描与换根法,看了看好像和树形dp差不多 F概率dp G费用流 回头再补 思路来源 马老师 归神 贤神等代码 http://www.mami ...

  2. codeforces Round 21 808E. Selling Souvenirs 【dp好题】

    codeforces Round 21 808E. Selling Souvenirs [dp好题] E. Selling Souvenirs time limit per test 2 second ...

  3. [Codeforces Round #254 div1] C.DZY Loves Colors 【线段树】

    题目链接:CF Round #254 div1 C 题目分析 这道题目是要实现区间赋值的操作,同时还要根据区间中原先的值修改区间上的属性权值. 如果直接使用普通的线段树区间赋值的方法,当一个节点表示的 ...

  4. Codeforces Round #701 (Div. 2) A ~ F ,6题全,超高质量良心题解【每日亿题】2021/2/13

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A - Add and Divide B - Replace and Keep Sorted C ...

  5. Codeforces Round #587 (Div. 3) C. White Sheet 思维

    传送门 文章目录 题意: 思路: 题意: 给你一个白色的矩形和俩个黑色的矩形,问白色被黑色覆盖后还能不能看到. 思路: 经典被简单题卡. 一开始写了个自我感觉很对的做法,结果wa41wa41wa41, ...

  6. Codeforces Round #636 (Div. 3) E. Weights Distributing 思维 + bfs

    传送门 文章目录 题意: 思路: 题意: n≤2e5,m≤2e5n\le2e5,m\le2e5n≤2e5,m≤2e5 思路: 怎么感觉每场div3div3div3都有一个巧妙的图论题. 首先如果只有两 ...

  7. Codeforces Round #617 (Div. 3) F. Berland Beauty 思维

    传送门 文章目录 题意: 思路: 题意: 给定一棵树,再给定若干两点最短路之间边权的最小值,让你给树的边权赋值,使得满足给定的条件,如果不存在输出−1-1−1. 思路: 观察一个性质,加入经过这条边的 ...

  8. php编程数学思维题,小学一年级数学思维训练100题打印版.doc

    小学一年级数学思维训练100题53297 PAGE PAGE 1 小学一年级思维训练100题 1.哥哥4个HYPERLINK "/click/click.php?r=/article_htm ...

  9. 枚举 ---- B. RPG Protagonist[Educational Codeforces Round 94 (Rated for Div. 2)]数学枚举

    B. RPG Protagonist 题目大意:就是你有两个人,每个人都有一个最大的体力值p和f,这两个人要去搬运剑和盾牌,剑的数量是cnts,盾的数量是cntw,每个剑的重量是是s,每个盾的重量是w ...

  10. Codeforces Round #352 div1 C D (智商+线段树)

    Ultimate Weirdness of an Array 题意:给一个数列ai, f(i,j) 定义为除去i到j之间的数后最大gcd(ai, aj)的值, 求所有f(i,j)之和 #include ...

最新文章

  1. python各个解释器的用途-11 个优秀的 Python 编译器和解释器
  2. sqlserver查找存储过程关键字方法之三
  3. log4net(c#) 配置及使用
  4. 计算机专业技能考核方案,计算机专业技能课教学目标考核方案教程.doc
  5. EF context.SaveChanges()特点
  6. 2090. 「ZJOI2016」旅行者 分治,最短路
  7. python中的与或非_「Python基础」 While 循环语句
  8. 适合初学者的安卓开源项目_开源世界中初学者的颠簸之旅
  9. 查了一晚上的资料,累啊。
  10. 怎么查看任天堂账号是哪个服务器的,科普:任天堂账号和NS的本地用户有什么区别?...
  11. UVa140 - Bandwidth
  12. solaris中如何新建一个用户登录
  13. 百度指数 自助采集 爬取 抓取 导出 提取 下载 查询
  14. NPDP第七章:产品生命周期管理
  15. c/c++实现简单的贪吃蛇可视化游戏
  16. mysql 1698_MySql Error 1698(28000)问题的解决方法
  17. 安全策略手记 (安全沙箱全攻略)
  18. matlab控制理论学习
  19. 博客及微博下载工具比较
  20. 【PyG学习入门】一:入门使用

热门文章

  1. 学习Maven命令中
  2. 一步一步理解拖拽Drag(一)
  3. 九宫格日记:微博难越,前路漫漫
  4. C#两个窗体间的相互通信(转)
  5. Java研发方向如何准备BAT技术面试
  6. 算法学习:01背包问题求具体方案
  7. 计算机系统结构02325知识点,02325计算机系统结构复习资料.doc
  8. python之HTML文件转PDF文件,python之把HTML文件转换成PDF格式文档
  9. python入门容易进阶难_为什么Python入门容易,精通却很难!Python进阶之路!
  10. vb6 英文和中文长度不同_PPT里中文排版就是没英文好看?你怕是假酒喝多了…...