栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

zoj 2937 Guard

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

zoj 2937 Guard

#include <map>#include <cmath>#include <cstdio>#include <limits>#include <vector>#include <algorithm>using namespace std;struct Point{    double x;    double y;    int mask;};int p, c, g, n;int v[12], mask[12], all;Point pt[100];double risk[100][12];double ans;inline double dist(const Point& lhs, const Point& rhs){    double x = lhs.x - rhs.x, y = lhs.y - rhs.y;    return sqrt(x * x + y * y);}void dfs(const vector<double>& arg, int level, int bound){    if(level == 0) {        ans = min(ans, *max_element(arg.begin(), arg.end()));        return;    }    vector<double> cmp(p);    --level;    for (int i = bound + 1; i < n; i++) {        for (int j = 0; j < p; j++) cmp[j] = min(arg[j], risk[i][j]);        dfs(cmp, level, i);    }}int main(void){    char ch, str[12];    while(scanf("%d", &p) != EOF && p != 0) {        scanf("%d%d", &c, &g);        all = 0;        map<char, int> mp;        for (n = 0; n < p; n++) { scanf(" %c%lf%lf%d", &ch, &pt[n].x, &pt[n].y, &v[n]); pt[n].mask = 0; all |= 1 << n; mp.insert(make_pair(ch, n));        }        for (int i = 0; i < c; i++) { mask[i] = 0; scanf("%s", str); int m = 0, tmp[12]; while(str[m] != '') {     tmp[m] = mp[str[m]];     mask[i] |= 1 << tmp[m];     ++m; } for (int j = 0; j < m; j++) {     pt[tmp[j]].mask |= mask[i];     for (int k = 0; k < j; k++) {         pt[n].x = (pt[tmp[j]].x * v[tmp[j]] + pt[tmp[k]].x * v[tmp[k]]) / (v[tmp[j]] + v[tmp[k]]);         pt[n].y = (pt[tmp[j]].y * v[tmp[j]] + pt[tmp[k]].y * v[tmp[k]]) / (v[tmp[j]] + v[tmp[k]]);         pt[n].mask = mask[i];         ++n;     } }        }        for (int i = 0; i < n; i++) { for (int j = 0; j < p; j++) {     if((pt[i].mask & (1 << j)) == 0) risk[i][j] = numeric_limits<double>::max();     else risk[i][j] = dist(pt[i], pt[j]) * v[j]; }        }        ans = numeric_limits<double>::max();        vector<double> cmp(p, numeric_limits<double>::max());        dfs(cmp, g, -1);        if(ans == numeric_limits<double>::max()) printf("too few guardsn");        else printf("%.2lfn", ans);    }    return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/381442.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号