POJ-5339 Untitled

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>

using namespace std;

int stack[105], tot;
int ans, a[105], A;
int n;

void dfs(int cur) {
    //printf("cur = %d\n", cur );
    if (cur == n) {
        if (tot == 0) return ;
        int x = A;
        for (int i = 1; i <= tot; i++) x %= stack[i];
        //for( int i = 1; i <= tot; i ++)
            //printf("%d ", stack[i]);
        //printf("\n");
        if (x == 0) {
            if (ans == -1) ans = tot;
            else ans = min(tot, ans);
        }
        return ;
    }
    stack[++ tot] = a[cur];
    //cout << "+++++++++++++++++++++++++++++++" << endl;
    dfs(cur + 1);
    //cout << "-------------------------------" << endl;
    -- tot;
    //printf("tot = %d\n", tot);
    dfs(cur + 1);
}

void work() {
    scanf("%d%d", &n, &A);
    for (int i = 0; i < n; i++) scanf("%d", &a[i]);
    sort(a, a + n); reverse(a, a + n);
    tot = 0;
    ans = -1;
    dfs(0);
    printf("%d\n", ans);
}

int main() {
    int T;
    scanf("%d", &T);
    for (int cas = 1; cas <= T; cas++) {
        work();
    }
    return 0;
}
 

题意:有一个整数a和n个整数b1,...,bn。挑选若干个数据重新排列,得到c1,...cr。保证a mod c1 mod c2 mod...mod cr =0。取最小的r。无解输出-1。

题解:第一次玩bestcoder..蛮好玩的..用了一个函数。用了一个全排列函数..(其实也可以自己手写一个全排列函数..)就是排序一次..全除一遍..如果不等于0 继续排序 继续除...(y = num[0])即取最小值。用于底下的判断(优化时间) (当被除数比最小值还小 直接弹出 进行下一轮循环)如果能整除 直接用goto End跳出二重循环..

编辑后:一开始以为过了hack就是AC没想到后面还有系统大数据判断 。就WA了(应该超时 毕竟全排列。)。本以为这道题就这么在草稿箱中自动腐化删除...后来波老师又拿这道题讲。用dfs深度查找..其实也是蛮难看懂是怎么写出来的..后来用那些注释掉的帮忙理解吧...总之还是得继续练吧。还没还没。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值