题目链接: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. mysql yum源安装极速

    mysql yum源地址:https://dev.mysql.com/downloads/repo/yum/ 随便找个最新的不管你是要装任何个历史版本他都可以,后面我会介绍: 安装第一步预置环境清理: ...

  2. sort、uniq 、 join 、 comm、diff 、 patch 、df、du 和 time 命令的用法

    1 sort 命令 同文本文件打交道时,总避不开排序,那是因为对于文本处理任务而言,排序(sort)可以起到不小的作用.sort 命令能够帮助我们对文本文件和 stdin 进行排序操作.通常,它会结合 ...

  3. 关于Java大整数是否是素数

    题目描述 请编写程序,从键盘输入两个整数m,n,找出等于或大于m的前n个素数. 输入格式: 第一个整数为m,第二个整数为n:中间使用空格隔开.例如: 103 3 输出格式: 从小到大输出找到的等于或大 ...

  4. tornado框架的简单实用

    一.安装模块 pip3 install tornado 二.简单的起服务的方法 import json, datetime from tornado.web import RequestHandler ...

  5. Python3.5学习之旅——day1

    本节内容: 1.Python介绍 2.Hello World程序 3.变量\字符编码 4.用户输入 5.if-else语句 6.循环语句 一.Python介绍 Python是一种动态解释性的强类型定义 ...

  6. 操作系统OS,Python - 有了GIL为什么还要threading.Lock()?

    参考: https://stackoverflow.com/questions/49859287/what-is-the-need-of-threading-lock-when-cpython-has ...

  7. 【代码总结】PHP文件的上传和下载

    ===================== 文件上传和下载 ===================== 一.php.ini的配置信息 file_uploads = On /Off    是否允许文件上 ...

  8. Java通过反射实现实例化

    public static void main(String[] args) throws Exception { User user= (User) test(User.class); System ...

  9. getopts以参数形式执行diag

    #!/bin/bash ################################################################################# # Copy ...

  10. fiddler 保存请求数据并发送到自己的服务器接口

    通过Rules菜单打开 Customize Rules 搜索 OnBeforeResponse 方法,再方法后面添加如下代码: if (oSession.fullUrl.Contains(" ...