Greedy:三角形问题
题目大意:有n根长度的为a1,a2....an的棒子,如果棒子可以组成三角形,求这些棒子能组成的三角形的最大周长?
这一题,一般人只能想到三重循环,当然我们是CS专业的,不能这样想,其实这题可以用DP(其实也不算DP),就是用o(n^2)的时间算出所有两根棒子的组合,然后再n的时间从大到小匹配
其实这一题有更简单的O(nlogn)的算法,那就是,既然我们都要选周长最大的三角形,那为什么我们不能从最大的棒子开始匹配呢?这样一想,其实DP也是在做这样的事情,从最大的开始做起,那么以为棒子的输入是随机的,我们就快排一次,然后从n-2开始往下匹配,完成任务
这一题真的是很简单,但是我一开始的时候还是没有想到,看来我还是需要很多锻炼
#include <stdio.h>
#include <stdlib.h>
#define CUTOFF 20 typedef int Position;
void Quick_Sort(Position, Position, Position *);
void Swap(Position, Position,Position *);
int Median_of_Three(Position, Position, Position,Position *);
void Insertion_Sort(Position, Position, Position *);
void Search(Position *, const int); int main(void)
{
int n, i;
while (~scanf("%d", &n))
{
if (n == )
break;
Position *A = (Position *)malloc(sizeof(Position)*n);
for (i = ; i < n; i++)
scanf("%d", &A[i]);
Quick_Sort(, n - , A);
Search(A, n);
free(A);
}
return ;
} void Swap(Position x, Position y, Position *A)
{
A[x] ^= A[y];
A[y] ^= A[x];
A[x] ^= A[y];
} int Median_of_Three(Position left, Position mid , Position right,Position *A)
{
if (A[left] > A[mid])
Swap(left, mid, A);
if (A[left] > A[right])
Swap(left, right, A);
if (A[mid] > A[right])
Swap(mid, right, A);
Swap(mid, right, A);
return A[right];
} void Insertion_Sort(Position left, Position right, Position *A)
{
int i, j, tmp;
for (i = left + ; i <= right; i++)
{
tmp = A[i];
for (j = i; j > left && A[j - ] > tmp; j--)
A[j] = A[j - ];
A[j] = tmp;
}
} void Quick_Sort(Position left, Position right, Position *A)
{
Position mid = (left + right) / ;
int i = left, j = right, pivot;
if (right - left > CUTOFF)
{
pivot = Median_of_Three(left, mid, right, A);
while (i < j)
{
while (A[++i] < pivot);
while (A[--j] > pivot);
if (i < j)
Swap(i, j, A);
else break;
}
Swap(i, right, A);
Quick_Sort(left, i - , A);
Quick_Sort(i + , right, A);
}
else
Insertion_Sort(left, right, A);
} void Search(Position *A, const int n)
{
int found = , i;
for (i = n - ; i >= ; i--)
{
if (A[i] < A[i - ] + A[i - ])
{
printf("%d\n", A[i] + A[i - ] + A[i - ]);
found = ;
break;
}
}
if (!found)
printf("0\n");
}
Greedy:三角形问题的更多相关文章
- HDU 4380 Farmer Greedy(叉积和三角形知识的综合应用)
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=115760#problem/A 题目意思大致为由n个点(n小于100)和m个金矿 ...
- hdu 4353 统计点在三角形内的个数
Finding Mine Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- canvas快速绘制圆形、三角形、矩形、多边形
想看前面整理的canvas常用API的同学可以点下面: canvas学习之API整理笔记(一) canvas学习之API整理笔记(二) 本系列文章涉及的所有代码都将上传至:项目代码github地址,喜 ...
- Android快乐贪吃蛇游戏实战项目开发教程-05虚拟方向键(四)四个三角形按钮
该系列教程概述与目录:http://www.cnblogs.com/chengyujia/p/5787111.html 一.如何判断点击的是哪个方向键按钮 在上篇教程中我们实现了左边的三角形按钮效果, ...
- Android快乐贪吃蛇游戏实战项目开发教程-04虚拟方向键(三)三角形按钮效果
该系列教程概述与目录:http://www.cnblogs.com/chengyujia/p/5787111.html 一.知识点讲解 当我们点击系统自带的按钮时,按钮的外观会发生变化.上篇博文中我们 ...
- Android快乐贪吃蛇游戏实战项目开发教程-03虚拟方向键(二)绘制一个三角形
该系列教程概述与目录:http://www.cnblogs.com/chengyujia/p/5787111.html 一.绘制三角形 在上一篇文章中,我们已经新建了虚拟方向键的自定义控件Direct ...
- 酷酷的CSS3三角形运用
概述 在早期的前端Web设计开发年代,完成一些页面元素时,我们必须要有专业的PS美工爸爸,由PS美工爸爸来切图,做一些圆角.阴影.锯齿或者一些小图标. 在CSS3出现后,借助一些具有魔力的CSS3属性 ...
- CSS制作三角形和按钮
CSS制作三角形和按钮 用上一篇博文中关于边框样式的知识点,能制作出三角形和按钮. 我先说如何制作三角形吧,相信大家在平时逛网站的时候都会看到一些导航栏中的三角形吧,比如说: 网易首页的头部菜单栏中, ...
- Effective前端3:用CSS画一个三角形
p { text-indent: 2em } .triangle-container p { text-indent: 0 } img { margin: 15px 0 } 三角形的场景很常见,打开一 ...
随机推荐
- iOS之单例
今天在看多线程同步时,突然想到了单例的同步问题.自从dispatch_once出现后,我们创建单例非常简单且安全: static dispatch_once_t pred; static Single ...
- 人工鱼群算法-python实现
AFSIndividual.py import numpy as np import ObjFunction import copy class AFSIndividual: "" ...
- BZOJ-1002 轮状病毒 高精度加减+Kirchhoff矩阵数定理+递推
1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 3543 Solved: 1953 [Submit][Statu ...
- 【长期更新】--神犇的BLOGS(各种高端讲解)
KMP字符串匹配算法: http://kb.cnblogs.com/page/176818/ http://blog.csdn.net/yutianzuijin/article/details/119 ...
- Android:View中的performClick()触发条件
http://blog.sina.com.cn/s/blog_70ae1d7b0102v7uk.html 先看看performClick()源码: public boolean performCl ...
- CentOS 6.4安装Apache+MySQL+PHP的图文教程
LAMP 实际上就是 Linux.Apache.MySQL.PHP 四个名称的缩写,当然最后一个 “P” 还有其他说法是 Perl 或者 Python.不用多说了,本文讲解的就是 Linux.Apac ...
- WIN 2003服务器终极安全及问题解决方案
一.硬盘分区与操 作系统的安装硬盘分区 总的来讲在硬盘分区上面没什么值得深入剖析的地方,无非就是一个在分区前做好规划知道要去放些什么东西, 如果实在不知 道.那就只一个硬盘只分一个区,分区要一次性完成 ...
- .NET设计模式(2):单件模式(Singleton Pattern)(转载)
概述 Singleton模 式要求一个类有且仅有一个实例,并且提供了一个全局的访问点.这就提出了一个问题:如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?客户程 序在调用某一个类时,它是不 ...
- iOS ASIHTTPRequest用https协议加密请求
iOS 终端请求服务端数据时,为了保证数据安全,我们一般会使用https协议加密,而对于iOS的网络编程,我们一般会使用开源框架:ASIHTTPRequest,但是如果使用传统的http方式,即使忽略 ...
- HTML5中的Range对象的研究
一:Range对象的概念 Range对象代表页面上的一段连续区域,通过Range对象,可以获取或修改页面上的任何区域,可以通过如下创建一个空的Range对象,如下: var range = docu ...