【light-oj】-’1307 - Counting Triangles(二分)
2016-09-16 17:35
525 查看
1307 - Counting Triangles
You are given N sticks having distinct lengths; you have to form some triangles using the sticks. A triangle is valid if its area is positive. Your task is to find the number of ways you can form a valid triangle using the sticks.
Each case starts with a line containing an integer N (3 ≤ N ≤ 2000). The next line contains N integers denoting the lengths of the sticks. You can assume that the lengths are distinct and each length lies in the range [1,
109].
题意:n个木棍,问有多少可以构成三角形。
题解:两两结合,判断第三条边可以的个数。(个数二分计算即可)
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define CLR(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define LL long long
LL a[2010];
int main()
{
int u,ca=1;
scanf("%d",&u);
while(u--)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
sort(a+1,a+1+n);
int sum,ans=0;
for(int i=1;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
sum=a[i]+a[j];
int pos=lower_bound(a+j,a+1+n,sum)-a;
ans+=(pos-j-1);
}
}
printf("Case %d: %d\n",ca++,ans);
}
return 0;
}
PDF (English) | Statistics | Forum |
Time Limit: 2 second(s) | Memory Limit: 32 MB |
Input
Input starts with an integer T (≤ 10), denoting the number of test cases.Each case starts with a line containing an integer N (3 ≤ N ≤ 2000). The next line contains N integers denoting the lengths of the sticks. You can assume that the lengths are distinct and each length lies in the range [1,
109].
Output
For each case, print the case number and the total number of ways a valid triangle can be formed.Sample Input | Output for Sample Input |
3 5 3 12 5 4 9 6 1 2 3 4 5 6 4 100 211 212 121 | Case 1: 3 Case 2: 7 Case 3: 4 |
题意:n个木棍,问有多少可以构成三角形。
题解:两两结合,判断第三条边可以的个数。(个数二分计算即可)
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define CLR(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define LL long long
LL a[2010];
int main()
{
int u,ca=1;
scanf("%d",&u);
while(u--)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
sort(a+1,a+1+n);
int sum,ans=0;
for(int i=1;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
sum=a[i]+a[j];
int pos=lower_bound(a+j,a+1+n,sum)-a;
ans+=(pos-j-1);
}
}
printf("Case %d: %d\n",ca++,ans);
}
return 0;
}
相关文章推荐
- 【Light-oj】-1138 - Trailing Zeroes (III)(二分,数学)
- Light oj Trailing Zeroes (III) (二分查找)
- 【Light-oj】-Expanding Rods(二分&几何)
- 【分块】【RMQ+二分】【主席树】oj_64 新年组队
- 哈理工oj/hrbust 1492 盒子【最大二分匹配】
- light oj 1307 - Counting Triangles (二分--三角形个数)
- 【light-oj】-大数整除(字符串)
- uestc oj Justice is Given by Light(计算几何)
- 【Light-oj】-1414 - February 29(容斥原理)
- LibreOJ #539. 「LibreOJ NOIP Round #1」旅游路线(倍增+二分)
- 【算法学习笔记】52.一道题的三种方法..二分答案、动态规划、计算几何 SJTU OJ 1250 BestSubsequence
- 南阳OJ-214-最长子序列-二分查找给力啊哈哈
- 【light-oj】-1305 - Area of a Parallelogram(水)
- fafu oj 1048 一个简单的问题 二分
- 【Light-OJ】-1410- Consistent Verdicts(思维)
- 【bzoj 入门OJ】[NOIP 热身赛]Problem B: escape(二分答案+bfs)
- OJ.【二分】就是看看这个方法就好
- light oj Halloween Costumes
- [洛谷 P2857][caioj 1120] 牛选牛圈 --- 二分+网络流-最大流
- OJ日常 | 二分查找——旋转数组的最小数字