HDU NO.3548 Enumerate the Triangles
来源:互联网 发布:广联达预算软件价格 编辑:程序博客网 时间:2024/06/06 02:30
题目大意:
给定1000个点,求围成三角形的最大周长。
解题思路:
先把边保存下来,减小后面不必要的复杂度,之后有三个循环1000^3,会超时,有个重要的剪枝,就是在第二个循环里面如果这两个点的长度的两倍大于等于最小周长,那么这个解不是最优,直接减掉,注意,这个剪枝非常重要。是解决这道问题的关键所在。
解题感想:
合理的剪枝很重要,如果if(2 * edge[i][j] >= Min)这样减就减到了500+ms,如果if(edge[i][j] >= Min)这样减就飙到了900+ms。
#include<iostream>#include<cmath>using namespace std;const int MAX = 1005;typedef struct point{ int x, y;} P;P po[MAX];double edge[MAX][MAX];inline double dealTri(int a, int b, int c){ return edge[a][b] + edge[a][c] + edge[b][c];}inline bool judge(int a, int b, int c){ if((edge[a][c] + edge[a][b] > edge[b][c]) && (edge[a][c] + edge[b][c] > edge[a][b]) && (edge[a][b] + edge[b][c] > edge[a][c])) return true; else return false;}int main(void){ int cas, cas_c = 1; scanf("%d", &cas); while(cas--) { memset(edge, 0, sizeof(edge)); int n; scanf("%d", &n); scanf("%d %d", &po[0].x, &po[0].y); for(int i = 1; i < n; i++) { scanf("%d %d", &po[i].x, &po[i].y); } for(int i = 0; i < n; i++) { for(int j = i + 1; j < n; j++) { edge[i][j] = edge[j][i] = sqrt((double)((po[i].x - po[j].x) * (po[i].x - po[j].x) + (po[i].y - po[j].y) * (po[i].y - po[j].y))); } } double Min = 10000000000; bool flag = false; for(int i = 0; i < n; i++) { for(int j = i + 1; j < n; j++) { if(edge[i][j] >= Min) continue; for(int k = j + 1; k < n; k++) { if(judge(i, j, k))//是三角形 { flag = true; double temp = dealTri(i, j, k); if(temp < Min) Min = temp; } } } } printf("Case %d: ", cas_c++); if(flag) printf("%.3lf\n", Min); else printf("No Solution\n"); } return 0;}
0 0
- HDU NO.3548 Enumerate the Triangles
- hdu 3549 Enumerate the Triangles
- hduoj 3548 Enumerate the Triangles
- HDU 3548 Enumerate the Triangles(找周长最小的三角形)
- HDU 3548 Enumerate the Triangles(找周长最小的三角形+优化)
- HDU 3458 Enumerate the Triangles(最小周长三角形)
- Enumerate the Triangles&&http://cdn.ac.nbutoj.com/Contest/view/id/14/problem/E.xhtml
- HDU4682 The Happy Triangles
- nyoj18 The triangles 【DP】
- HDU 1396 Counting Triangles
- HDU 1396 Counting Triangles
- HDU 1396 Counting Triangles
- HDU 1396 Counting Triangles
- hdu 1396 Counting Triangles
- HDU 1396 Counting Triangles
- HDU 1396 Counting Triangles
- enumerate
- enumerate
- VXWORKS和QT
- 简单的面向对象类的写法
- 收藏下Android手机驱动
- 从系统源码角度分析Android事件分发
- 几种分割平面问题
- HDU NO.3548 Enumerate the Triangles
- linux内存管理--linux内核高端内存
- POJ 1556 The Doors(判断线段相交 + 最短路)
- 遇到鬼了,Ajax.BeginForm提交表单,页面居然会跳转?? !!!!
- POJ1002
- InputStreamReader原理
- Cocos2dx 小技巧(九)现成的粒子特效
- 高精度阶乘
- 让你提前认识软件开发(12):配置文件读取及文件操作