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\n";
            continue;
        }

        dfs1(-1, 0);
        cout << maxn << endl;
    }
    return 0;
}

LOoK

时间: 2024-08-29 15:01:42

HDU 3720 深搜 枚举的相关文章

hdu 1258(深搜)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1258 Sum It Up Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4012    Accepted Submission(s): 2066 Problem Description Given a specified total t

HDU 2717 深搜第一题、

题意:求n到k的最小路径,  n有三种变法 n+1,n-1或者2*n: 贴个广搜的模版在这里把.... 总结一下:一般涉及到求最短路的话用深搜 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<queue> 5 #include<cstring> 6 using namespace std; 7 const int qq=1e5+10; 8 int v

HDU 1010 深搜+减枝

HDU 1010 /************************************************************************* > File Name: HDU1010.cpp > Author:yuan > Mail: > Created Time: 2014年11月05日 星期三 22时22分56秒 **********************************************************************

POJ-1190-生日蛋糕-DFS(深搜)-枚举-多重剪枝

题目链接: 这个题目很好,有难度:可以好好的多做做: #include<iostream> #include<string> #include<cstdio> #include<cstring> #include<queue> #include<map> #include<cmath> #include<stack> #include<set> #include<vector> #inc

HDU 1010 深搜+奇偶剪枝

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1010 贴个资料: http://acm.hdu.edu.cn/forum/read.php?tid=6158 奇偶剪枝: 对于从起始点 s 到达终点 e,走且只走 t 步的可达性问题的一种剪枝策略. 如下列矩阵 : 从任意 0 到达 任意 0,所需步数均为偶数,到达任意 1 ,均为奇数.反之亦然 所以有,若s走且只走 t 步可到达e,则必有t >= abs(s.x - e.x) + abs(s.y -

hdu 1010 深搜+剪枝

深度搜索 剪枝 还不是很理解 贴上众神代码 //http://blog.csdn.net/vsooda/article/details/7884772#include<iostream> #include<math.h> using namespace std; char map[10][10]; int N,M,T; int di,dj,escape; int dir[4][2]={{0,-1},{0,1},{1,0},{-1,0}}; void dfs(int x,int y,

hdu 1204 深搜

#include <iostream> #include <string> #define MAX 110 #define OIL true #define BLANK false using namespace std; bool oil_map[MAX][MAX]; int dir_map[8][2]={ {1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1} }; void set_oil_map() { memset(oi

【深搜加剪枝五】HDU 1010 Tempter of the Bone

Tempter of the BoneTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 64326    Accepted Submission(s): 17567 Problem Description The doggie found a bone in an ancient maze, which fascinated him a l

深搜基础题目 杭电 HDU 1241

HDU 1241 是深搜算法的入门题目,递归实现. 原题目传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1241 代码仅供参考,c++实现: #include <iostream> using namespace std; char land[150][150]; int p,q; void dfs(int x,int y){ land[x][y] = '*'; if(land[x-1][y]!= '@' && land[x+1]