UVa 216 Getting in Line【枚举排列】

题意:给出n个点的坐标,(2<=n<=8),现在要使得这n个点连通,问最小的距离的和

因为n很小,所以可以直接枚举这n个数的排列,算每一个排列的距离的和,

保留下距离和最小的那个排列就可以了(这个地方和带宽那题有点像,用memcpy将整个排列保留下来)

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include <cmath>
 5 #include<stack>
 6 #include<vector>
 7 #include<map>
 8 #include<set>
 9 #include<queue>
10 #include<algorithm>
11 using namespace std;
12
13 #define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i)
14
15 typedef long long LL;
16 const int INF = (1<<30)-1;
17 const int mod=1000000007;
18 const int maxn=100005;
19
20 int p[maxn],bestp[maxn];
21
22 struct node{
23     int x,y;
24 } a[maxn];
25
26 double dis(int x1,int y1,int x2,int y2){
27      return sqrt((double)(x2 - x1) * (x2 - x1) +(double) (y2 - y1) * (y2 - y1));
28  }
29
30 int main(){
31   // freopen("in.txt","r",stdin);
32 //    freopen("out.txt","w",stdout);
33     int  n;
34     double ans,minn=0;
35     int kase=0;
36     while(scanf("%d",&n)!=EOF&&n){
37         for(int i=0;i<n;i++) {
38             cin>>a[i].x>>a[i].y;
39             if(i!=0) minn+=dis(a[i].x,a[i].y,a[i-1].x,a[i-1].y);
40         }
41
42         for(int i=0;i<n;i++) p[i]=i;
43         memcpy(bestp,p,sizeof(p));
44
45
46         while(next_permutation(p,p+n)){
47             ans=0;
48             for(int i=1;i<n;i++)
49                     ans+=dis(a[p[i]].x,a[p[i]].y,a[p[i-1]].x,a[p[i-1]].y);
50
51         //    printf("ans=%lf\n",ans);
52
53                 if(ans<minn){
54                     minn=ans;
55                     memcpy(bestp,p,sizeof(p));
56                 }
57         }
58
59         printf("**********************************************************\n");
60         printf("Network #%d\n",++kase);
61         for(int i = 1; i < n; ++i)
62             printf("Cable requirement to connect (%d,%d) to (%d,%d) is %.2lf feet.\n",(int)a[bestp[i-1]].x,
63                     (int)a[bestp[i-1]].y,(int)a[bestp[i]].x,(int)a[bestp[i]].y,16.0 + dis(a[bestp[i-1]].x,a[bestp[i-1]].y,a[bestp[i]].x,a[bestp[i]].y));
64         printf("Number of feet of cable required is %.2lf.\n",minn + (n - 1) * 16.0);
65     }
66     return 0;
67 }

时间: 2024-10-05 18:39:49

UVa 216 Getting in Line【枚举排列】的相关文章

uva 216 Getting in Line (暴力枚举)

uva 216  Getting in Line Computer networking requires that the computers in the network be linked. This problem considers a ``linear" network in which the computers are chained together so that each is connected to exactly two others except for the t

UVA - 146 - ID Codes (枚举排列)

UVA - 146 ID Codes Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description It is 2084 and the year of Big Brother has finally arrived, albeit a century late. In order to exercise greater control over its ci

UVa 216 - Getting in Line

题目:给你n台电脑所在的平面位置,求把他们连乘线型网络需要的最小的网线长度. 分析:搜索,枚举. 因为数据规模很小,枚举所有电脑的全排列,每一个排列对应一种连线方式. 枚举所有的连线方式,找到其中最小的,输出路径即可. 说明:开始以为是最短路或者最小生成树类似物(⊙_⊙). #include <iostream> #include <cstdlib> #include <cstdio> #include <cmath> using namespace std

UVA - 10098 - Generating Fast (枚举排列)

思路:生成全排列,用next_permutation,注意生成之前先对那个字符数组排序. AC代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cmath> using namespace std; char str[20]; int main() { int n; cin >> n; while(n-

UVA - 10892 LCM Cardinality (枚举因子)

A pair of numbers has a unique LCM but a single number can be the LCM of more than one possible pairs. Forexample 12 is the LCM of (1, 12), (2, 12), (3,4) etc. For a given positive integer N, the number of different integer pairs withLCM is equal to

蓝桥杯 2014本科C++ B组 六角填数 枚举排列

标题:六角填数 如图[1.png]所示六角形中,填入1~12的数字. 使得每条直线上的数字之和都相同. 图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少? 请通过浏览器提交答案,不要填写多余的内容. 简单的枚举排列,只要提前将12个结点标号,来判断六个线段总和是否相等. 代码如下: 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define MAXN 13 5 int num

uva 1560 - Extended Lights Out(枚举 | 高斯消元)

题目链接:uva 1560 - Extended Lights Out 题目大意:给定一个5?6的矩阵,每个位置上有一个灯和开关,初始矩阵表示灯的亮暗情况,如果按了这个位置的开关,将会导致周围包括自己位置的灯状态变换,求一个按开关位置,保证所有灯都灭掉. 解题思路: 枚举,枚举第一行的状态,然后递推出后面四行的状态. 高斯消元,对于每个位置对定变量,这样列出30个方程求解. C++ 枚举 #include <cstdio> #include <cstring> #include &

uva 565 - Pizza Anyone?(暴力枚举 + 二进制)

题目:uva 565 - Pizza Anyone?(暴力枚举 + 二进制) 题目大意:题目是说有一个人要帮他的朋友们定批萨,然后每个朋友都有自己的口味要求,问能不能定一个批萨然后满足每个朋友的至少一个要求. 能就输出所定批萨里面加的东西,,输出要求按字典序: 不能就输出:No pizza can satisfy these requests. 解题思路:这题里面有16种材料,每种材料只有取与不取的可能,这样就有 2^16 种( 0 - 2^16 - 1),枚举出每种情况然后在分别看是否能满足每

poj 1270 Following Orders 枚举排列

题意: 给一个字符集和一些字符之间的小于关系,求字符集上的所有可能排列. 分析: 暴力枚举可以分为枚举子集,枚举排列,枚举组合,这题是个简单的枚举排列,枚举过程中用小于关系剪枝即可. 代码: //poj 1270 //sep9 #include <iostream> #include <algorithm> using namespace std; char vars[64],constraint[256],ans[64]; int g[128][128],vis[256]; in