题目链接: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;
}

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

最新文章

  1. 丢掉慢吞吞的AVD吧,android模拟神器:Genymotion
  2. Caffe源码解析3:Layer
  3. js 判断移动设备、pc端、android、iPhone、是否为微信、微博、qq空间
  4. JavaScript设计模式学习笔记
  5. Android RadioButton 语言无法切换问题
  6. 探秘Tomcat(一)——Myeclipse中导入Tomcat源码
  7. [Flex] IFrame系列 —— IFrame嵌入html点击其他组件后页面消失的问题
  8. MVC5使用SignalR进行双向通信(1)
  9. [读]剑指offer
  10. Android之HTTP网络通信--GET传递
  11. skip跳跃表的实现
  12. C# Http POST get
  13. C++实现Log()日志函数
  14. android开发过程中遇到的小问题
  15. Hibernate基础学习(五)&mdash;对象-关系映射(下)
  16. Asp.net mvc3的“从客户端中检测到有潜在危险的 Request.Form 值”问题解决
  17. idea自我使用简单使用方式和出现的一些简单问题以及常用快捷键
  18. 【转】sed 高级用法
  19. 每天一套题打卡|河南省第十一届ACM/ICPC
  20. 字符串的顺序倒置。(Reverse)

热门文章

  1. Es查询结果集默认是10000,更新设置
  2. 安装oracle11g时出现:在注册表中没有找到指定的主目录名
  3. MySQL - 在Ubuntu下密码初始化
  4. 攻防世界Web进阶-Upload1
  5. teraterm中状态框statusbox
  6. C++代码书写规范——给新手程序员的一些建议
  7. LeetCode 445. Add Two Numbers II(链表求和)
  8. iOS 开发之 开发一款自己的美颜相机
  9. cookie、 Session Storage 、 Local Storage
  10. CPD