【Codeforces Round #317 Div1 —— A】Lengthening Sticks【数学思维题】
题意:
给出三个木棒的长度为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<b+y+z+cb+y<a+x+z+cz+c<a+x+b+y\left\{ \begin{aligned} & x+y+z = \text{H} \\ & a+x < b+y+z+c \\ & b+y < a+x+z+c \\ & z+c < 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之后,计算有多少种方案使得木棒无法构成三角形。木棒无法构成三角形主要是因为 最长的木棒长度 >>> 剩下两个木棒长度相加。因此我们枚举哪一根木棒是最长的木棒。
假如枚举了木棒 aaa 为最长的木棒,则
{x+y+z=Ha+x>b+y+c+z\left\{ \begin{aligned} & x+y+z = \text{H} \\ & a+x > b+y+c+z \\ \end{aligned} \right.{x+y+z=Ha+x>b+y+c+z
可以得到 2∗x>b+c+H−a2*x >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【数学思维题】相关推荐
- Educational Codeforces Round 67 (Rated for Div. 2)(D思维题 线段树/E树形dp(换根dp) 二次扫描与换根法)
心得 D写了个假算法被hack了wtcl- E据涛神说是二次扫描与换根法,看了看好像和树形dp差不多 F概率dp G费用流 回头再补 思路来源 马老师 归神 贤神等代码 http://www.mami ...
- codeforces Round 21 808E. Selling Souvenirs 【dp好题】
codeforces Round 21 808E. Selling Souvenirs [dp好题] E. Selling Souvenirs time limit per test 2 second ...
- [Codeforces Round #254 div1] C.DZY Loves Colors 【线段树】
题目链接:CF Round #254 div1 C 题目分析 这道题目是要实现区间赋值的操作,同时还要根据区间中原先的值修改区间上的属性权值. 如果直接使用普通的线段树区间赋值的方法,当一个节点表示的 ...
- Codeforces Round #701 (Div. 2) A ~ F ,6题全,超高质量良心题解【每日亿题】2021/2/13
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A - Add and Divide B - Replace and Keep Sorted C ...
- Codeforces Round #587 (Div. 3) C. White Sheet 思维
传送门 文章目录 题意: 思路: 题意: 给你一个白色的矩形和俩个黑色的矩形,问白色被黑色覆盖后还能不能看到. 思路: 经典被简单题卡. 一开始写了个自我感觉很对的做法,结果wa41wa41wa41, ...
- Codeforces Round #636 (Div. 3) E. Weights Distributing 思维 + bfs
传送门 文章目录 题意: 思路: 题意: n≤2e5,m≤2e5n\le2e5,m\le2e5n≤2e5,m≤2e5 思路: 怎么感觉每场div3div3div3都有一个巧妙的图论题. 首先如果只有两 ...
- Codeforces Round #617 (Div. 3) F. Berland Beauty 思维
传送门 文章目录 题意: 思路: 题意: 给定一棵树,再给定若干两点最短路之间边权的最小值,让你给树的边权赋值,使得满足给定的条件,如果不存在输出−1-1−1. 思路: 观察一个性质,加入经过这条边的 ...
- php编程数学思维题,小学一年级数学思维训练100题打印版.doc
小学一年级数学思维训练100题53297 PAGE PAGE 1 小学一年级思维训练100题 1.哥哥4个HYPERLINK "/click/click.php?r=/article_htm ...
- 枚举 ---- B. RPG Protagonist[Educational Codeforces Round 94 (Rated for Div. 2)]数学枚举
B. RPG Protagonist 题目大意:就是你有两个人,每个人都有一个最大的体力值p和f,这两个人要去搬运剑和盾牌,剑的数量是cnts,盾的数量是cntw,每个剑的重量是是s,每个盾的重量是w ...
- Codeforces Round #352 div1 C D (智商+线段树)
Ultimate Weirdness of an Array 题意:给一个数列ai, f(i,j) 定义为除去i到j之间的数后最大gcd(ai, aj)的值, 求所有f(i,j)之和 #include ...
最新文章
- python各个解释器的用途-11 个优秀的 Python 编译器和解释器
- sqlserver查找存储过程关键字方法之三
- log4net(c#) 配置及使用
- 计算机专业技能考核方案,计算机专业技能课教学目标考核方案教程.doc
- EF context.SaveChanges()特点
- 2090. 「ZJOI2016」旅行者 分治,最短路
- python中的与或非_「Python基础」 While 循环语句
- 适合初学者的安卓开源项目_开源世界中初学者的颠簸之旅
- 查了一晚上的资料,累啊。
- 怎么查看任天堂账号是哪个服务器的,科普:任天堂账号和NS的本地用户有什么区别?...
- UVa140 - Bandwidth
- solaris中如何新建一个用户登录
- 百度指数 自助采集 爬取 抓取 导出 提取 下载 查询
- NPDP第七章:产品生命周期管理
- c/c++实现简单的贪吃蛇可视化游戏
- mysql 1698_MySql Error 1698(28000)问题的解决方法
- 安全策略手记 (安全沙箱全攻略)
- matlab控制理论学习
- 博客及微博下载工具比较
- 【PyG学习入门】一:入门使用
热门文章
- 学习Maven命令中
- 一步一步理解拖拽Drag(一)
- 九宫格日记:微博难越,前路漫漫
- C#两个窗体间的相互通信(转)
- Java研发方向如何准备BAT技术面试
- 算法学习:01背包问题求具体方案
- 计算机系统结构02325知识点,02325计算机系统结构复习资料.doc
- python之HTML文件转PDF文件,python之把HTML文件转换成PDF格式文档
- python入门容易进阶难_为什么Python入门容易,精通却很难!Python进阶之路!
- vb6 英文和中文长度不同_PPT里中文排版就是没英文好看?你怕是假酒喝多了…...