• HDU 3720 深搜 枚举


    DES:从23个队员中选出4—4—2—1共4种11人来组成比赛队伍。给出每个人对每个职位的能力值。给出m组人在一起时会产生的附加效果。问你整场比赛人员的能力和最高是多少。

    用深搜暴力枚举每种类型的人选择情况。感觉是这个深搜写的很机智。

    在vector中存结构体就会很慢。TLE。直接存序号就AC了。以后还是尽量少用结构体吧。

    #include<stdio.h>
    #include<string.h>
    #include<map>
    #include<vector>
    #include<iostream>
    using namespace std;
    
    vector<int>play[4];
    vector<int>ans;
    int pow[30];
    map<string, int>mtype;
    map<string, int>mname;
    int eff[40][40];
    int maxn = 0;
    
    void dfs2(int, int );
    void dfs3(int, int );
    void dfs4(int, int );
    
    void dfs1(int pos, int sum)
    {
        if (sum == 1)
        {
            dfs2(-1, 0);
            return;
        }
        for (int i=pos+1; i<play[1].size(); ++i)
        {
            ans.push_back(play[1][i]);
            dfs1(i, sum+1);
            ans.pop_back();
        }
    }
    
    void dfs2(int pos, int sum)
    {
        if (sum == 4)
        {
            dfs3(-1, 0);
            return;
        }
        for (int i=pos+1; i<play[2].size(); ++i)
        {
            ans.push_back(play[2][i]);
            dfs2(i, sum+1);
            ans.pop_back();
        }
    }
    
    void dfs3(int pos, int sum)
    {
        if (sum == 4)
        {
            dfs4(-1, 0);
            return;
        }
        for (int i=pos+1; i<play[3].size(); ++i)
        {
            ans.push_back(play[3][i]);
            dfs3(i, sum+1);
            ans.pop_back();
        }
    }
    
    void dfs4(int pos, int sum)
    {
        if (sum == 2)
        {
            int anss = 0;
            for (int i=0; i<ans.size(); ++i)
            {
                for (int j=i+1; j<ans.size(); ++j)
                {
                    anss += eff[ans[i]][ans[j]];
                }
                anss += pow[ans[i]];
            }
            if (anss > maxn)
                maxn = anss;
            return;
        }
        for (int i=pos+1; i<play[0].size(); ++i)
        {
            ans.push_back(play[0][i]);
            dfs4(i, sum+1);
            ans.pop_back();
        }
    }
    
    int main()
    {
        mtype["goalkeeper"] = 1;
        mtype["defender"] = 2;
        mtype["midfielder"] = 3;
        mtype["striker"] = 0;
        char name[40], type[30];
        int power;
        while(cin >> name)
        {
            maxn = -0x3f3f3f3f;
            ans.clear();
            for (int i=0; i<4; ++i) play[i].clear();
    
            cin >> power >> type;
            int tt = mtype[type];
            pow[0] = power;
            mname[name] = 0;
            play[tt].push_back(0);
            memset(eff, 0, sizeof(eff));
    
            for (int i=1; i<=22; ++i)
            {
                cin >> name >> power >> type;
                pow[i] = power;
                mname[name] = i;
                int tt = mtype[type];
                play[tt].push_back(i);
            }
    
            int n;
            cin >> n;
            int n1, n2, add;
            char na1[40], na2[40];
            for (int i=1; i<=n; ++i)
            {
                cin >> na1 >> na2 >> add;
                n1 = mname[na1];
                n2 = mname[na2];
                eff[n1][n2] = add;
                eff[n2][n1] = add;
            }
            int a[4] = {2, 1, 4, 4};
            bool flag = true;
            for (int i=0; i<4; ++i)
            {
                if (play[i].size() < a[i])
                {
                    flag  = false;
                    break;
                }
            }
            if (!flag)
            {
                cout << "impossible
    ";
                continue;
            }
    
            dfs1(-1, 0);
            cout << maxn << endl;
        }
        return 0;
    }
    LOoK
  • 相关阅读:
    iCloud文件同步至Mac本地磁盘
    hive多分区写入
    清理hdfs小文件shell脚本
    大数据应用建设开源工具-update2019-07
    手机号码段:中国工信.三大运营商号段-update2019-09
    sparkf:spark-sql替换hive查询引擎
    hivef:hive 执行 sql 文件
    azkaban 工作流2.0开发示例
    MySQL-时间+日期函数
    大数据仓库对业务数据的几个基本要求
  • 原文地址:https://www.cnblogs.com/icode-girl/p/4704162.html
Copyright © 2020-2023  润新知