zoukankan      html  css  js  c++  java
  • Arranging Your Team HDU

    思路

    题意:此题大意是指首先给你23个队员的信息,包括他们的名字,能力值,在赛场上的职位。然后给出几个若能满足某两个队员同时在球场上就额外加上一定的值。最后让你从23个队员中选出11个人,使得最终的value最大。
    具体思路:由于从样例中可以发现字符串比较多,加之需要进行姓名和姓名、score之间关系的记录,这就用到了map。利用dfs对所有队员进行遍历,具体说明在代码中指出。

    AC代码

    //#include<bits/stdc++.h>
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<map>
    #include<algorithm>
    using namespace std;
    map<string, int> id;
    map<string, int> manid;
    int def = 4, mid = 4, str = 2, goal = 1;
    int sum[6], M, asso[24][24];
    int vis[24];
    int maxs = 0;
    struct Men
    {
        int value, pos;
    };
    Men man[24];
    void init()
    {
        string s = "defender";
        id[s] = 1;
        s = "midfielder";
        id[s] = 2;
        s = "striker";
        id[s] = 3;
        s = "goalkeeper";
        id[s] = 4;
    }
    void dfs(int last, int d, int m, int s, int g) 		//d, m, s, g分别指defenders, midfielders,  strikers, goalkeeper,last可以避免重复
    {
        if(d == 4 && m == 4 && s == 2 && g == 1)		//满足条件时
        {
            int cnt = 0;
            for(int i = 0; i < 23; i++)
            {
                if(vis[i])
                {
                    cnt += man[i].value;
                    for(int j = i + 1; j < 23; j++)
                    {
                        if(vis[j])
                        {
                            cnt += asso[i+1][j+1];		
                        }
                    }
                }
            }
            maxs = max(maxs, cnt);			//不断记录所有情况,最后得到最大值
            return ;
        }
        for(int i = last; i < 23; i++)
        {
            if(vis[i])
                continue;
            if(man[i].pos == 1 && d >= 4) continue;
            if(man[i].pos == 2 && m >= 4) continue;
            if(man[i].pos == 3 && s >= 2) continue;
            if(man[i].pos == 4 && g >= 1) continue;
            vis[i] = 1;
            if(man[i].pos == 1)
                dfs(i, d+1, m, s, g);
            else if(man[i].pos == 2)
                dfs(i, d, m+1, s, g);
            else if(man[i].pos == 3)
                dfs(i, d, m, s+1, g);
            else if(man[i].pos == 4)
                dfs(i, d, m, s, g+1);
            vis[i] = 0;
        }
    }
    int main()
    {
        // freopen("input.txt", "r", stdin);
        // freopen("output.txt", "w", stdout);
        init();
        string na, p;
        int v;
        while(cin >> na )
        {
            cin >> v >> p;
            manid.clear();
            man[0].value = v;
            manid[na] = 1;
            man[0].pos = id[p];
            memset(sum, 0, sizeof(sum));
            sum[id[p]] ++;
            for(int i = 1; i < 23; i++)
            {
                cin >> na >> v >> p;
                manid[na] = i + 1;
                man[i].value = v;
                man[i].pos = id[p];
                sum[id[p]] ++;
            }
            cin >> M;
            memset(asso, 0, sizeof(asso));
            for(int i = 0; i < M; i++)
            {
                string s1, s2;
                int s;
                cin >> s1 >> s2 >> s;
                asso[manid[s1]][manid[s2]] = s;		//记录s1, s2同时存在时的score值
                asso[manid[s2]][manid[s1]] = s;
            }
            if(sum[1] < 4 || sum[2] < 4 || sum[3] < 2 || sum[4] < 1)
            {
                cout << "impossible" << endl;
                continue;
            }
            memset(vis, 0, sizeof(vis));
            maxs = -0x7ffffff;
            dfs(0, 0, 0, 0, 0);
            cout << maxs << endl;
        }
    
    }
    
  • 相关阅读:
    freemarker 遍历 hashmap 到select option
    三分钟跑起jsblocks
    hibernate_@GeneratedValue
    跑github上的Symfony项目遇到的问题2
    Activiti使用过程_1
    Symfony官方视频教程
    跑github上的Symfony项目遇到的问题
    剧本杀
    随遇而安
    开发者职场心得
  • 原文地址:https://www.cnblogs.com/KeepZ/p/11370706.html
Copyright © 2011-2022 走看看