您的位置:首页 > 其它

Bestcoder Round#49 1001Untitled

2015-08-02 12:13 1431 查看
http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=611&pid=1001

对于一组可能的答案c,如果先对一个觉小的ci

​​ 取模,再对一个较大的cj取模,那么这个较大的cj

​肯定是没有用的。因此最终的答案序列中的c肯定是不增的。那么就枚举选哪些数字,并从大到小取模看看结果是否是0就可以了。时间复杂度O(2^n)



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

using namespace std;
const int INF = 0x3f3f3f3f;
int i,t,minV,n,a;
int s[100050];
void dfs(int b,int t,int k)
//b是当前这个数 t是剩下的总个数 k是求的值
{
if (k > minV) return;
if (b==0)
{
minV = min(minV,k);
return;
}
for(int i = t-1;i>=1;i--)
{
if (b>=s[i])
dfs(b%s[i],i,k+1);
}
}

int main()
{
freopen("in.txt","r",stdin);
scanf("%d",&t);
while(t--)
{
minV = INF;
scanf("%d%d",&n,&a);
for(int i = 1; i <= n; i++)
scanf("%d",&s[i]);
sort(s+1,s+n+1);
dfs(a,n+1,0);
if (minV != INF)
printf("%d\n",minV);
else
printf("-1\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: