题目链接:https://www.hackerrank.com/contests/codestorm/challenges/ilia

这周六玩了一天的Codestorm,这个题目是真的很好玩,无奈只做出了四道题,自己太菜,difficult的题目一道题都没出,把moderate的题目拿出来总结一下吧。

给了一些棍子,每根棍子的长度各不相同,然后问这些棍子组成的锐角三角形的个数、直角三角形的个数、钝角三角形的个数。

思路很明显,枚举前面两根木棒的长度,然后二分第三根木棒的长度。复杂度O(n^2logn)。

代码:

#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#pragma warning(disable:4996)
using namespace std; #define maxn 10005 typedef long long ll; ll n;
ll val_2[maxn];
ll val[maxn];
ll ha[maxn]; int main()
{
//freopen("i.txt", "r", stdin);
//freopen("o.txt", "w", stdout); ll i, j, pos, v, v_sum;
ll cnt1, cnt2, cnt3, pos1, pos2, pos3, pos_sum;
memset(ha, 0, sizeof(ha)); scanf("%lld", &n);
for (i = 1; i <= n; i++)
{
scanf("%lld", &val[i]);
val_2[i] = val[i] * val[i];
ha[val[i]]++;
}
sort(val + 1, val + n + 1);
sort(val_2 + 1, val_2 + n + 1);
cnt1 = 0;
cnt2 = 0;
cnt3 = 0;
for (i = 1; i <= n; i++)
{
for (j = i + 1; j <= n; j++)
{
v = val_2[i] + val_2[j];
pos = lower_bound(val_2 + j + 1, val_2 + n + 1, v) - val_2; if (val_2[pos] == v)
{
cnt2 = cnt2 + ha[val[pos]];
pos3 = pos + ha[val[pos]];
}
else
{
pos3 = pos;
}
pos1 = pos - (j + 1); v_sum = val[i] + val[j];
pos_sum = lower_bound(val + j + 1, val + n + 1, v_sum) - val; pos2 = pos_sum - pos3; if (pos1 >= 0)
cnt1 = cnt1 + pos1;
if (pos2 >= 0)
cnt3 = cnt3 + pos2;
}
}
cout << cnt1 << " " << cnt2 << " " << cnt3 << endl;
//system("pause");
return 0;
}

亮点在后面,题解的思想是,如果对每根棍子按长度排好序之后,用sliding window的思想能够把时间复杂度降到O(n^2)。看了一下这个代码,觉得写得更好,充分利用了前面比较的关系。

代码:

#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#pragma warning(disable:4996)
using namespace std; #define MA(x,y) ((x)>(y)?(x):(y)) const int N = 5002;
int a[N], b[N], n; int input()
{
//freopen("i.txt", "r", stdin);
//freopen("o.txt", "w", stdout); scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]), b[i] = a[i] * a[i];
return 0;
} int sol()
{
long long x = 0, y = 0, z = 0; sort(a + 1, a + n + 1);
sort(b + 1, b + n + 1); for (int i = 1; i <= n; i++)
{
int p = i + 1;
int q = i + 1;
for (int j = i + 1; j <= n; j++)
{
while (p<n && b[i] + b[j] >= b[p + 1])
p++;
q = MA(q, p);
while (q<n && a[i] + a[j]>a[q + 1])
q++;
if (b[i] + b[j] == b[p])
{
x += MA(p - 1 - j, 0);
y++;
z += q - p;
}
else
{
x += MA(p - j, 0);
z += q - p;
}
}
}
cout << x << " " << y << " " << z << endl;
return 0;
} int main()
{
input();
sol();
return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

Codestorm:Counting Triangles 查各种三角形的个数的更多相关文章

  1. hdu 1396 Counting Triangles(递推)

    Counting Triangles Problem Description Given an equilateral triangle with n thelength of its side, p ...

  2. Counting Triangles(hd1396)

    Counting Triangles Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  3. UVA 12075 - Counting Triangles(容斥原理计数)

    题目链接:12075 - Counting Triangles 题意:求n * m矩形内,最多能组成几个三角形 这题和UVA 1393类似,把总情况扣去三点共线情况,那么问题转化为求三点共线的情况,对 ...

  4. 1307 - Counting Triangles

    1307 - Counting Triangles    PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 ...

  5. 统计无向图中三角形的个数,复杂度m*sqrt(m).

    统计无向图中三角形的个数,复杂度m*sqrt(m). #include<stdio.h> #include<vector> #include<set> #inclu ...

  6. LeetCode:有效三角形的个数【611】

    LeetCode:有效三角形的个数[611] 题目描述 给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数. 示例 1: 输入: [2,2,3,4] 输出: 3 解释: 有 ...

  7. Leetcode 611.有效三角形的个数

    有效三角形的个数 给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数. 示例 1: 输入: [2,2,3,4] 输出: 3 解释: 有效的组合是: 2,3,4 (使用第一个 ...

  8. LeetCode 611. 有效三角形的个数(Valid Triangle Number)

    611. 有效三角形的个数 611. Valid Triangle Number 题目描述 LeetCode LeetCode LeetCode611. Valid Triangle Number中等 ...

  9. Java实现 LeetCode 611 有效三角形的个数(双指针)

    611. 有效三角形的个数 给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数. 示例 1: 输入: [2,2,3,4] 输出: 3 解释: 有效的组合是: 2,3,4 ( ...

随机推荐

  1. OBS输出设置

    参数建议来自虎牙 https://help.huya.com/284 3.输出: 1)编码器中x264相当于虎牙直播中的CPU H.264编码,NVENC H.264相当于虎牙直播中的NVIDIA H ...

  2. php封装的mysqli类完整实例

    本文实例讲述了php封装的mysqli类.分享给大家供大家参考,具体如下:类: <?php header('content-type:text/html;charset=utf-8'); /* ...

  3. 循环语句(while语句和do...while语句)

    1.while语句:如果条件成立,就继续循环,直到条件不成立为止.格式如下: while (条件) {               循环体(语句或语句块) } 2.do…while语句:如果条件成立, ...

  4. 电影推荐算法---HHR计划

    1,先看FM部分. 2,看看冷启动. 0,热门召回源. 1,男女召回源,年龄召回源,职业召回源,score最高. 2,男女年龄职业相互组合: 3,存入redis.天级别更新. 3,召回+排序先搞懂. ...

  5. 文件图标SVG

    ​<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink ...

  6. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 排版:可滚动

    <!DOCTYPE html> <html> <head> <title>菜鸟教程(runoob.com)</title> <meta ...

  7. Python基础-1 基础语法

    基础语法 标识符 所谓的标识符就是对变量.常量.函数.类等对象起的名字. 首先必须说明的是,Python语言在任何场景都严格区分大小写!也就是说A和a代表的意义完全不同 python对于表示标识符的命 ...

  8. 关于程序状态字寄存器PSW(Program Status Word)与多核多线程

    内核态(Kernel Mode)与用户态(User Mode) CPU通常有两种工作模式即:内核态和用户态,而在PSW中有一个二进制位控制这两种模式. 内核态:当CPU运行在内核态时,程序可以访问所有 ...

  9. 解题报告:luogu P1433 吃奶酪

    题目链接:P1433 吃奶酪 我感觉可以改成:[模板]TSP问题(商旅问题) 了. 爆搜\(T\)一个点,考虑状压\(dp\)(还是爆搜). 我们用\(dp[i][j]\)表示现在是\(i\)状态,站 ...

  10. mysql-e选项

    -e Execute command and quit 通过-e选项,可以在命令行中操作mysql 一些mysql设置的有密码,此时可以在my.ini(my.cnf)的[client]下面给出数据库的 ...