挑战程序设计竞赛 1.61 nlogn算法
2015-04-25 15:40
183 查看
问题如下:
OK,这道题非常简单,朴素算法我就不说了,书上也给出了朴素O(n^3)的代码,但是同时也告诉我们还有更高效的算法,我当时琢磨了一下,排序,确定其中两个再用二分查找可以的到一个O(n^2logn)的算法,但是同样不高效。然后,然后.....
我发现这道题居然是一道贪心......
怎么贪呢?
代码如下:
第一:edge[i],edge[i-1],edge[i-2]能构成三角形,不多说它肯定周长最大;
第二:如果它们不能构成,edge[i]为最大的三角形一定不能找到另外两条使其构成三角形的边,为什么呢?相信你已经清楚了,那就是edge[i-1]+edge[i-2]>其他任意俩边之和。
OK,这道题非常简单,朴素算法我就不说了,书上也给出了朴素O(n^3)的代码,但是同时也告诉我们还有更高效的算法,我当时琢磨了一下,排序,确定其中两个再用二分查找可以的到一个O(n^2logn)的算法,但是同样不高效。然后,然后.....
我发现这道题居然是一道贪心......
怎么贪呢?
代码如下:
#include<cstdio> #include<algorithm> #include<cstdlib> #include<cmath> #include<cstring> #include<queue> #include<string> #include<map> #include<set> #include<iostream> #include<ostream> #include<istream> #include<vector> #include<functional> #define ll long long; const int inf=0x3f3f3f3f; using namespace std; const int maxn=1005; int edge[maxn]; int main() { int n; cin>>n; for(int i=0;i<n;i++) { scanf("%d",&edge[i]); } sort(edge,edge+n); bool flag=0; for(int i=n-1;i>=2;i--) { if(edge[i]<edge[i-1]+edge[i-2]) { flag=1; cout<<edge[i]+edge[i-1]+edge[i-2]<<endl; break; } } if(!flag)cout<<0<<endl; return 0; }为什么这个算法是正确的呢?我们来证明一下
第一:edge[i],edge[i-1],edge[i-2]能构成三角形,不多说它肯定周长最大;
第二:如果它们不能构成,edge[i]为最大的三角形一定不能找到另外两条使其构成三角形的边,为什么呢?相信你已经清楚了,那就是edge[i-1]+edge[i-2]>其他任意俩边之和。
相关文章推荐
- 挑战程序设计竞赛——1.61三角形
- 挑战程序设计竞赛 4.4常用技巧(二)
- 迷宫问题_BFS_挑战程序设计竞赛p34
- 挑战程序设计竞赛里面的部分题目<用java写的>
- 挑战程序设计竞赛 2.6 数学问题的解题窍门
- 挑战程序设计竞赛 2.1迷宫的最短路径
- 挑战程序设计竞赛2 算法和数据结构 读后感
- 挑战编程 程序设计竞赛训练手册-1.6.3 旅行(The Trip)
- 挑战程序设计竞赛选录:1
- poj3320 尺取法 <挑战程序设计竞赛>
- poj3276 反转 挑战程序设计竞赛
- 挑战程序设计竞赛 部分和问题
- 二分图判定 (挑战程序设计竞赛)
- [挑战程序设计竞赛] POJ 2718 - Smallest Difference
- [挑战程序设计竞赛] POJ 1328 - Radar Installation
- 挑战程序设计竞赛(第2版) 第2章习题
- 最小生成树---Kruskal算法---挑战程序设计竞赛读书笔记
- 挑战程序设计竞赛 01背包变换对象
- 【挑战程序设计竞赛】后缀数组 实现字符串匹配
- 挑战程序设计竞赛 算法和数据结构 第12章 图