广工校赛——游戏王

Description

小学的时候,Stubird非常喜欢玩游戏王,有一天,他发现了一个绝佳的连锁组合,这个连锁组合需要6张卡, 可是他一张都没有,但是他的那些朋友们有,不过当然,他们不会白给,不过也不排除有人和他交情好,送给他了。 不过他们有成全别人的美德,当他们看到Stubird已经有某些他们喜欢的卡的时候,他们会给他优惠,或者更贵也说不定 嘛不过,你可以把有的卡片藏起来,不告诉他们,来获得更低的价格。 问他最少需要多少钱才可以集齐所有的卡。

Input

第一行T,表示有T个测试样例 第二行,n表示他有n个朋友(n<=100) 下一行,m(0<=m<=2的6次方)表示有多少种卡片的集合,num表示他有的这张卡片的编号是(0-5),数据保证所给的集合不重复; 3*m行,第一行都有一个数,k(k<=5),表示这个集合包含的卡片张数 下一行k个数,表示每张卡片的编号(0-5)(不会包含num) 下一行一个数c,表示如果你有这个组合下购买num卡,所需要的花费c;

Output

输出最小的花费,如果不可能集齐则输出-1

Sample Input

1 6 1 0 0 1 1 1 0 1 1 2 0 1 1 3 0 1 1 4 0 1 1 5 0 1

Sample Output

6

HINT

大意:呃....没有大意- -题解说是状态DP,反正还没学到,bin神代码先挂着~~

/* ***********************************************
Author        :kuangbin
Created Time  :2015/3/15 14:17:30
File Name     :GDUT\A.cpp
************************************************ */

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;

const int INF = 0x3f3f3f3f;
int dp[1000];
int st[6410],cost[6410];
int num[6410];

int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int T;
    scanf("%d",&T);
    while(T--){
        int n;
        scanf("%d",&n);
        int cnt = 0;
        for(int i = 0;i < n;i++){
            int m;
            int nn;
            int p;
            scanf("%d%d",&m,&nn);
            while(m--){
                int k;
                scanf("%d",&k);
                st[cnt] = 0;
                num[cnt] = nn;
                while(k--){
                    scanf("%d",&p);
                    st[cnt] |= (1<<p);
                }
                scanf("%d",&cost[cnt]);
                cnt++;
            }
        }
        for(int i = 0;i < (1<<6);i++)dp[i] = INF;
        dp[0] = 0;
        for(int i = 0;i < (1<<6);i++){
            if(dp[i] == INF)continue;
            for(int j = 0;j < cnt;j++){
                if( (i&(1<<num[j])) != 0)continue;
                if( (i|st[j]) != i )continue;
                dp[i|(1<<num[j])] = min(dp[i|(1<<num[j])],dp[i]+cost[j]);
            }
        }
        int tot = (1<<6)-1;
        if(dp[tot] == INF)dp[tot] = -1;
        printf("%d\n",dp[tot]);
    }
    return 0;
}

时间: 2024-10-29 08:11:34

广工校赛——游戏王的相关文章

记一次坑爹的广工校赛

4-10,广工校赛,一场坑爹的邂逅...... 首先,路程坑爹,问了好久路才到什么GUI工学馆.... 其次,天气坑爹,怎么老是下雨.... 最后,比赛坑爹,本垃圾被坑得不要不要的,为什么题A1小时前和一小时后看的是不一样的,改题面,改样例,恩,你倒不如新增一道题算了:为什么题C无解啊!广工:大家注意,没有这种数据(没有你放出来干*啊).... 传送门 Problem A: Krito的讨伐 题意:略 题解:实质上是贪心模拟题,先从根节点往下走,把根节点的怪都消灭掉之后,在把它的儿子都加进来,最

广工校赛——slamdunk正在做菜

Description 广工的slamdunk可谓是人生赢家,据传说他现在即将拥有一个girlfriend,并且在感情的驱使下他甚至开始学起了做菜! 现在他想为girlfriend做N道菜,每道菜做出来需要Ai分钟,slamdunk一分钟最多能煮M道菜,请问他做完这N道菜所需的最短时间 是多少?(如果你能帮他解决这个问题,他和他的girlfriend会送给你一个精美的气球~) Input 第一行输入一个整数T表示测试数据共有T(1 <= T <=10)组 每组测试数据的第一行有一个正整数N(1

广工校赛——GG的匹配串

Description 2015年广东工业大学ACM校赛要来~\(≧▽≦)/~辣辣辣,作为校赛的出题人之一,GG想出了一道水题来考考大家.相信小伙伴们都学过字符串匹配,于是字符串匹配的水题就诞生辣!GG给出了一段长度为N的大写字母序列,现在他要你修改这一段字母序列,使得这段字母序列上最前面的K个字母组成的序列与最后面的K个字母组成的序列一一匹配.  例如对于序列“ATUUUUAC”和K = 2,可以通过将第二个字母修改为“C”,使得最前面的两个字母与最后面的两个字母都为“AC”,当然 还存在其他

余数 2015广工校赛 C 魔幻任务

题目传送门 题意:问n位最小能整除47的数字 分析:打表发现前面都是100000...,后两位就是100000%47后到47的距离,就是快速幂求1000000%47的值,47-它就是后两位 #include <bits/stdc++.h> using namespace std; const int A = 47; int pow_mod(int x, int n, int p) { int ret = 1; while (n) { if (n & 1) ret = 1ll * ret

广工校赛——并查集——变形金刚

Description 有一天Stubird买了一台变形金刚,店员说,这台变形金刚和其他那种骗小孩子的不一样 他真的能变形. 这台变形金刚有n个部件,他们能互相连接,组成机器人,当然,也可以变形. 但是有一天,The tesseract 的能量突然消失了,部件散落一地,当然有些部件还连接着. 现在你只有把部件全部连接起来,他就能变回原样,例如,有4个部件,1,2是连接的,3,4也是连接着的 ,你只需要把1和3连接起来(1,4或者2,3或者2,4)他就能变回原样啦. 他现在问你最少需要多少次连接才

广工校赛决赛之简单的数论题

题目链接:F: 我是好人,题目大意:给你两个数 n 和 m,问你有多少对正整数对最大公约数是n,最小公倍数是m. 因为1 <= n, m <= 10000000000,暴力法肯定超时的,比赛时我也想到了把 n 和 m 分解开,质因数和对应的指数存放在 map 中,思路是正确的,可没想到在一些细节问题上没考虑周全,在没有判断 n 和 m 是否互质前就盲目地把它们进行分解,结果当然是wa了数遍,亏我还在苦苦思索是不是思路出错了,直至今天与文聪讨论时才发现这个瑕疵.用朴素的分解方法已经能够在时限范围

广工校赛——DP——悦动达人

Description 一个游戏,在屏幕上有5个格子形成一行,每一秒都会有一个格子闪烁,格子闪烁时你需要保证至少有一只手指在格子上面, 现在我们已经知道第i秒时,第xi个格子会闪烁,我们假设手指的移动不花费时间,你现在用两根手指玩这个游戏, 设初始两根手指都在0处位置,算出n秒过后手指需要移动的最小距离.(允许手指交叉) 注:手指移动的距离的计算是,假设你的一根从x,移动到y格,那么移动的距离是|x-y| Input 第一行一个数T,表示有T组测试数据(T<=50) 第二行,n,表示进行n秒(1

广工校赛——LCS——完美串

Description 爱美之心人皆有之,GG也不例外.所以GG他对于完美串有一种热衷的爱.在GG眼中完美串是一个具有无比魅力的01子串.这个子串有之其魅力之处,对它取反后水平翻转,它又和它原来的一模一样.这就是GG热爱它的原因.但是世上并不是所有的01串都是完美串,所以GG下定决心想改造01串,使所有的01串都成为完美串.但是改造01串是一个巨大的工程,GG太忙了,他还差T个01串未改造,他需要你的帮助.而你只需要告诉它至少添加几个'0','1'字符就可以使得01串成为完美串. Input 有

广工校赛——漂洋过海来看你

Description BMan和hyx住在一个神奇的国度,这个国度有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来. 现在BMan在第S号城市,他经常想起那个一起AC过的队友hyx,记忆它总是慢慢的累积,在他心中无法抹去,可是他并不知道hyx 在哪个城市,所以他决定用尽半年的积蓄漂洋过海去找hyx,现在BMan很想知道如果他想去hyx所在的第X号城市,必须经过的前 一个城市是第几号城市(放心,由于心系队友,BMan是不会选择走重复的路的~) Input 第一行输入一个整数T表示测试