【ID搜索】uva12558Egyptian Fractions(HARD version) 埃及分数
2015-07-27 21:51
281 查看
http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=34882
题目描述:对一个分数(n/mn/m)将它分解成若干个不相等的单分子分数(即分子为1)。求最少能分解成哪几个分数相加。若有多解,输出分母尽量的小的解。会有k个禁止使用的单分子分数。
这是一道经典的迭代加深搜索题。因为深度和广度都是无限的。
要注意在搜索第i个数时,ai>=ai−1a_i>=a_{i-1}。为了保证之后可以分解成depth-i+1个数,ai<=m∗(depth−i+1)/na_i<=m*(depth-i+1)/n
那k个禁用的数可以用STL中的map,set保存。但由于k<=5k<=5,就直接用数组保存,每次来遍历一次。
交的时候请注意long long用%lld输出…身为蒟蒻的我就是TLE了几次…….
蒟蒻加油 ↖(^ω^)↗
题目描述:对一个分数(n/mn/m)将它分解成若干个不相等的单分子分数(即分子为1)。求最少能分解成哪几个分数相加。若有多解,输出分母尽量的小的解。会有k个禁止使用的单分子分数。
这是一道经典的迭代加深搜索题。因为深度和广度都是无限的。
要注意在搜索第i个数时,ai>=ai−1a_i>=a_{i-1}。为了保证之后可以分解成depth-i+1个数,ai<=m∗(depth−i+1)/na_i<=m*(depth-i+1)/n
那k个禁用的数可以用STL中的map,set保存。但由于k<=5k<=5,就直接用数组保存,每次来遍历一次。
交的时候请注意long long用%lld输出…身为蒟蒻的我就是TLE了几次…….
蒟蒻加油 ↖(^ω^)↗
#include <iostream> #include <cstdio> #include <cstring> #define LL long long int #define MAXN 10010 using namespace std; LL n ,m ,del[10] ,dep ,ans[MAXN] ,temp[MAXN] ; int k ; bool flag ; bool find(LL a) { for(int i=0;i<k;++i) if(del[i]==a) return 1; return 0; } LL gcd(LL a,LL b) { if(!b)return a; return gcd(b,a%b); } bool better() { for(int i=dep;i>=0;--i) if(temp[i]!=ans[i]) return temp[i]<ans[i]; return 0; } void dfs(int d,LL a,LL b)// a/b { if(d==dep) { if(b%a)return; temp[d]=b/a; if(find(b/a))return; if(!flag||better()) memcpy(ans,temp,sizeof(LL)*(d+1)); flag=1; return; } LL tmp ,a2 ,b2 ; //注意不要写成 end=b*(dep+1-d)/d ; i<end 会wa掉的= = for(LL i=max(b/a,temp[d-1])+1;;++i) { if(b*(dep+1-d)<=i*a) break; if(find(i))continue; a2=a*i-b ,b2=b*i ; tmp=gcd(a2,b2); temp[d]=i; dfs(d+1,a2/tmp,b2/tmp); } } int main() { int T ; scanf("%d",&T); for(int cas=1;cas<=T;++cas) { scanf("%lld%lld%d",&n,&m,&k); for(int i=0;i<k;++i) scanf("%lld",&del[i]); for(dep=0;;++dep) { flag=0; dfs(0,n,m); if(flag)break; } printf("Case %d: %lld/%lld=",cas,n,m); for(int i=0;i<dep;++i) printf("1/%lld+",ans[i]); printf("1/%lld\n",ans[dep]); } return 0; }
相关文章推荐
- Torch7 教程 Supervised Learning CNN
- 如何选择Solr的布署方案
- 字符串的输入问题
- Virtual Environments for mac
- 字符串的输入问题
- Python reportlab教程
- 23种设计模式
- 结构体大小计算
- uva10534(DP之LIS的应用 )
- HDU 4288 Coder(模拟) 附:upper_bound与lower_bound的比较
- Java 里使用 long 类型的数据一定要在数值后面加上 “L”
- Centos7安装图形界面
- log4cpp-回滚文件
- POJ2115 C Looooops(扩展欧几里得)
- HDOJ 题目4276 The Ghost Blows Light(SPFA+树形DP)
- 1025约瑟夫问题
- IOS开发小项目—找色块游戏
- 7.27文字排版
- Object-C中需要注意的细节
- std::list与std::deque用法