5th 【基础题】组合三角形
来源:互联网 发布:如何看待网络言论作文 编辑:程序博客网 时间:2024/06/11 06:02
组合三角形
【题目描述】:
桌面上凌乱地摆放着N个木棍,长度分别为{a1,a2…,ai,…an},N<=6000,1<=ai<=100,000,000,选择三个木棍为边组成三角形,问有多少种不同的组合。三个木棍的不同排列,只能算一种组合。假设ai<=ajak。
【输入描述】:
第一行,一个整数N。
第二行N个木棍的长度。
【输出描述】:
只有一个数表示能够组成三角形的组数,最后的结果可能比较大。
【样例输入】
73 5 7 4 9 5 1
【样例输出】
15
【数据范围及描述】:
难得遇到这种简单点的题目了, 虽然简单我还是要写博客的-。-
n=6000,n三次暴力肯定是不行滴,所以先排个序咯,看看有什么规律
样例 1 3 4 5 5 7 9
我们发现排完序后只要【a[i]+a[j]>a[k]】 (0<i<j<k<n+1)就满足形成三角形。
所以我们穷举i和j,k从j+1开始: while(a[i]+a[j]>a[k]&&k<=n) k++;
如果存在一个k恰好使得不满足上述条件了,那么说明前面的都满足,所以加上j-i-1个解。
当j在增加的时候,无需每个j都修改k,k的值可以在原来的基础上增加,因为i是不变的,j往后推,k也必须往后推
如果存在一个k恰好使得不满足上述条件了,那么说明前面的都满足,所以加上j-i-1个解。
当j在增加的时候,无需每个j都修改k,k的值可以在原来的基础上增加,因为i是不变的,j往后推,k也必须往后推
这样就解决问题了
中心程序:
for(int i=1;i<=n-2;i++)
{ int k=i+2;
for(int j=i+1;j<=n-1;j++)
{
while(a[i]+a[j]>a[k]&&k<=n)
k++;
ans+=k-j-1;
}
全部代码如下
for(int i=1;i<=n-2;i++)
{ int k=i+2;
for(int j=i+1;j<=n-1;j++)
{
while(a[i]+a[j]>a[k]&&k<=n)
k++;
ans+=k-j-1;
}
全部代码如下
#include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cstring>#define ll long longint n,a[6005];ll ans;using namespace std;int main(){ cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; sort(a+1,a+n+1); for(int i=1;i<=n-2;i++) { int k=i+2; for(int j=i+1;j<=n-1;j++) { while(a[i]+a[j]>a[k]&&k<=n) k++; ans+=k-j-1; } } cout<<ans<<endl; //while(1);return 0;}
阅读全文
0 0
- 5th 【基础题】组合三角形
- 算法学习之三角形组合
- hdu 1249 三角形 组合数学
- C++ Primer 5th - 2.1 基础内建类型
- 12th 【基础】二进制计数
- 14th 【基础】宾馆房间
- SQL基础语句---1th
- 【基础】倒杨辉三角形
- 学习基础 字符三角形
- 三角形 —— 基础
- # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
- 5th Feb: 刷题笔记
- 用*号组合成一个三角形
- BZOJ 3505 CQOI2014 数三角形 组合数学
- 【bzoj3505】【CQOI2014】【数三角形】【组合数学】
- 3505: [Cqoi2014]数三角形 组合数学
- BZOJ 3505: [Cqoi2014]数三角形|组合数学
- [组合计数] BZOJ 3505 [Cqoi2014]数三角形
- WebApp验证码生成与使用
- Barracuda
- 在项目启动时(无request)获取Tomcat端口号
- Set集合
- S2SM集成Shiro-登录验证
- 5th 【基础题】组合三角形
- 开源的RippleLayout,点击产生波浪涟漪效果
- ecshop之transport和jquery冲突之完美解决方案
- 【实践】端到端的OCR:验证码识别
- Java菜鸟成长之路__Day_2_Java_方法
- Redis原理详解
- Android Fingerprint -- Enroll流程
- vue2 子组件调用父组件中的方法
- centos7 最小化安装后无法上网,需要先开启网络服务