码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 5339 Untitled (状态压缩枚举)

时间:2015-08-02 15:14:20      阅读:89      评论:0      收藏:0      [点我收藏+]

标签:hdu   状态压缩   


Untitled

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

Total Submission(s): 570    Accepted Submission(s): 291

Problem Description

There is an integer a and n integers b1,,bn. After selecting some numbers from b1,,bn in any order, say c1,,cr, we want to make sure that a mod c1 mod c2 mod mod cr=0 (i.e., a will become the remainder divided by ci each time, and at the end, we want a to become 0). Please determine the minimum value of r. If the goal cannot be achieved, print ?1 instead.
 
Input
The first line contains one integer T5, which represents the number of testcases.
For each testcase, there are two lines:
1. The first line contains two integers n and a (1n20,1a106).
2. The second line contains n integers b1,,bn (?1in,1bi106).
 
Output
Print T answers in T lines.
 
Sample Input
2 2 9 2 7 2 9 6 7
 
Sample Output
2 -1
 
Source
BestCoder Round #49 ($)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5339

题目大意:重排列bi,问a对重排列的数不断取模最快能为0的取模次数

题目分析:其实是水题,首先对数字小的取完余后再对数字大的取余等于没取,所以先对大数字取余,从大到小排序,因为n很小,DFS随意搜,也可以用状态压缩做,把每个数字选或不选的状态二进制压缩

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int const MAX = 1 << 22;
int const INF = 0x3fffffff;
int b[25], sta[MAX];

int lowbit(int x)
{
    return x & (-x);
}

bool cmp(int a, int b)
{
    return a > b;
}

int main()
{
    int T;
    scanf("%d", &T);
    while(T --)
    {
        memset(sta, 0, sizeof(sta));
        int n, a;
        scanf("%d %d", &n, &a);
        for(int i = 1; i <= n; i++)
            scanf("%d", &b[i]);
        sort(b + 1, b + n + 1, cmp);
        for(int i = 1; i <= n; i++)
            sta[1 << (i - 1)] = b[i];
        int cnt, ans = INF;
        for(int i = 1; i < (1 << n); i++)
        {
            int tmp = a;
            cnt = 0;
            for(int j = i; j > 0; j -= lowbit(j))
            {
                tmp %= sta[lowbit(j)];
                cnt ++;
            }
            if(tmp == 0)
                ans = min(ans, cnt);
        }
        if(ans == INF)
            printf("-1\n");
        else
            printf("%d\n", ans);
    }
}


 

版权声明:本文为博主原创文章,未经博主允许不得转载。

HDU 5339 Untitled (状态压缩枚举)

标签:hdu   状态压缩   

原文地址:http://blog.csdn.net/tc_to_top/article/details/47206995

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!