算法竞赛入门经典第七章暴力求解法——简单枚举(记录向)
来源:互联网 发布:php免杀一句话 编辑:程序博客网 时间:2024/05/06 10:25
- 7-1 简单枚举
题目大意:输入n,按从小到大顺序输出形如abcde/fghij=n,其中a~j是数字0~9的一个排列。
代码如下:
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int main(){ int n; char a[99]; while(scanf("%d",&n)==1&&n) { for(int fghij = 1234;fghij<98765;fghij++) { int ok = 1; int abcde = n*fghij; sprintf(a,"%05d%05d",abcde,fghij); if(strlen(a)>10)break;//字符串长度若大于10,直接退出循环 sort(a,a+10); for(int i=0;i<10;i++) { if(a[i] != '0'+i) { ok = 0; break; } } if(ok) printf("%05d / %05d = %d\n",abcde,fghij,n); } } return 0;}
本题如果枚举0~9的所有排列,然后判断是否符合题意,这个枚举量无疑是巨大的,所以只需要枚举fghij,然后通过n*fghij算出abcde,然后用sprintf来把abcde和fghij放到一个数组里,然后排个序,然后判断是否为“0123456789”即可。
- 7-2 最大乘积
题目大意:输入n个元素,找出连续子序列最大乘积。
代码如下:
#include<cstdio>#include<iostream>using namespace std;int s[20];int main(){ int n; while(scanf("%d",&n)==1) { long long pro = 1; for(int i=0;i<n;i++) { scanf("%d",&s[i]); } int max = s[0]*s[1]; for(int begin=0;begin<n-1;begin++) { for(int end=begin+1;end<n;end++) { pro = 1; for(int i = begin;i<=end;i++) { pro *=s[i]; } if(pro>max) max = pro; } } if(max<0) printf("0\n"); else printf("%d\n",max); } return 0;}
因为是连续子序列,那么只需要枚举开始与结尾,然后用max来更新最大值即可。
- 7-3 分数拆除
题目大意:输入正整数,找到所有正整数x>=y,使得1/k = 1/x + 1/y。
代码如下:
#include<stdio.h>int main(){ int k; while(scanf("%d",&k)==1&&k) { int c = 2*k; for(int y=1;y<=c;y++) { if(y<=k)continue; if(k*y%(y-k)==0) { int x = (k*y)/(y-k); printf("1/%d = 1/%d + 1/%d\n",k,x,y); } } } return 0;}
我第一次看到这个题目的时候,把1/k = 1/x + 1/y这个式子做了个变换,同乘以kxy,那么式子变成xy = ky + kx,即x = ky / (y-k)之后我就无从下手了,后来刘汝佳老师在书中的提示:题目有个条件为x>=y,那么可以通过这个不等式与1/k = 1/x + 1/y联立,解出y<=2*k,那么就可以通过输入的k枚举y,然后再通过我变换的式子x = ky / (y-k),求出x(注意,这时的x必须为整数,我当时竟然傻乎乎地研究如何判断x为整数,其实直接ky%(y-k)即可,我真傻23333)。
从以上题目来看,虽然暴力是很“暴力”的,但是也是有很大的技巧的,如何减少暴力的规格,减少时间复杂度这也是一门大学问。
1 0
- 算法竞赛入门经典第七章暴力求解法——简单枚举(记录向)
- 算法竞赛入门经典第七章暴力求解法——枚举排列(记录向)
- 算法竞赛入门经典第七章暴力求解法——回溯(2.例题深入)
- 《算法竞赛入门经典》-【第七章:暴力求解法】-7.2:枚举排列
- 算法竞赛入门经典:第七章 暴力求解法 7.5枚举排列
- 算法竞赛入门经典(第二版)-刘汝佳-第七章 暴力求解法 例题(6/15)
- 算法竞赛入门经典(第二版)-刘汝佳-第七章 暴力求解法 习题(2/18)
- 算法竞赛入门经典_第七章 暴力求解法_7.2枚举排列:生成1~n的排列
- 算法竞赛入门经典 暴力求解法 7.1简单枚举 除法
- 算法竞赛入门经典 暴力求解法 7.1简单枚举 最大乘积
- 算法竞赛入门经典 暴力求解法 7.1简单枚举 分数拆分
- 算法竞赛入门经典 暴力求解法 简单枚举 7.1.4 双基回文数
- 算法竞赛入门经典第七章暴力求解法7.1节第一题
- 算法入门竞赛经典第七章暴力求解法7.1.1
- 《算法竞赛入门经典》-【第七章:暴力求解法】-7.3:子集生成
- 《算法竞赛入门经典》-【第七章:暴力求解法】-7.4:回溯法
- 算法竞赛入门经典:第七章 暴力求解法 7.1除法
- 算法竞赛入门经典:第七章 暴力求解法 7.2最大乘积
- PHPExcel导入导出文件
- 51nod 1163
- mybatis xml中的数组
- VC从EXE文件弹窗中获取路径
- 删除链表中的元素-LintCode
- 算法竞赛入门经典第七章暴力求解法——简单枚举(记录向)
- 编写简单的Mapreduce程序并部署在Hadoop2.2.0上运行
- 日志总结-Java内部类
- IOS cocopods导入XMPP 时出现 ios redefinition of xxxx
- MD5加密汉字与站长工具MD5结果不一样
- Java学习日记番外篇:线程
- java运算符
- 采用正则表达式获取地址栏参数
- Static 关键字