zoukankan      html  css  js  c++  java
  • UVA 10911 Forming Quiz Teams

    UVA_10911

        这个题目关键在于对分组状态的表示,看了别人的解题报告后发现,由于N很小,所以可以用一个整数的二进制来表示分组状态,该位置为1则代表该队员还未分组,状态转移就是枚举分组的策略就可以了。

        个人感觉用记忆化搜索应该比较好实现一些。

    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #define MAXD 70000
    #define MAXN 20
    #define INF 1000000000
    int N;
    double x[MAXN], y[MAXN], f[MAXD];
    char b[30];
    double sqr(double a, double b)
    {
    return (a - b) * (a - b);
    }
    int init()
    {
    int i;
    scanf("%d", &N);
    N *= 2;
    if(!N)
    return 0;
    for(i = 0; i < N; i ++)
    scanf("%s%lf%lf", b, &x[i], &y[i]);
    return 1;
    }
    double dp(int st)
    {
    int i, j;
    double min = INF, temp;
    if(f[st] > -1)
    return f[st];
    for(i = 0; i < N; i ++)
    if((1 << i) & st)
    for(j = i + 1; j < N; j ++)
    if((1 << j) & st)
    {
    temp = dp(st ^ (1 << i) ^ (1 << j)) + f[(1 << i) + (1 << j)];
    if(temp < min)
    min = temp;
    }
    return f[st] = min;
    }
    void solve()
    {
    int i, j;
    double res;
    f[0] = 0;
    for(i = 1; i < (1 << N); i ++)
    f[i] = -2;
    for(i = 0; i < N; i ++)
    for(j = i + 1; j < N; j ++)
    f[(1 << i) + (1 << j)] = sqrt(sqr(x[i], x[j]) + sqr(y[i], y[j]));
    res = dp((1 << N) - 1);
    printf("%.2f\n", res);
    }
    int main()
    {
    int t = 0;
    while(init())
    {
    printf("Case %d: ", ++ t);
    solve();
    }
    return 0;
    }


  • 相关阅读:
    异步、作用域、闭包--setTimeout在for循环中的思考
    C++中*和&的定义和使用
    利用border设置transparent绘制图形
    暑假周记四
    暑假周记三
    win10系统下安装Linux虚拟机以及在虚拟机上安装Ubuntu
    暑假周记二
    暑假周记一
    《浪潮之巅》上——阅读笔记06
    《浪潮之巅》上——阅读笔记05
  • 原文地址:https://www.cnblogs.com/staginner/p/2272330.html
Copyright © 2011-2022 走看看