算法之枚举
little pepper
哒哒!!!
展开
-
枚举
基本思想:枚举思想其实是一种生活的智慧,在实际生活中有着非常广泛的应用。经常遇到这样的情景:忘记了数字密码的最后一位,就从0~9逐个尝试;去提货点取快递,快递员检查完所有包裹才找到属于自己的;在网上买机票,输入日期、起点和终点,就会列出所有的行程方案……以上在进行归纳推理时,逐个考察了某类事情所有可能的情况,并逐一进行检验,这种方法叫作枚举。 可见,枚举算法就是对问题变量可能解集...原创 2018-08-15 17:37:02 · 383 阅读 · 0 评论 -
凸包问题(枚举)
凸包的定义,直观的来看就是,由平面上n个点组成的集合,其凸包就是包含这些点的最小凸多边形,凸多边形的任何一条边所在的直线把凸多边形全部划在了同一个半平面内。性质:如果点集中两个点的连线属于凸多边形的边,当且仅当点集中其余的点都在这两个点连线的同一侧。利用这个性质,可以求解凸包问题。若已知由n个点构成集合的凸包是以其中某些点为顶点的凸多边形(这个凸多边形一定是最小凸多边形),且这些点具有凸包的性...原创 2018-09-23 20:26:45 · 1066 阅读 · 0 评论 -
最近对问题(枚举)
问题描述:最近对问题是求解平面点集n个点中距离最近的两个点间的问题。简化条件:一:点对之间的距离是没有方向性的。二:为了简化计算(开平方),我们采用直接平方比较。#include<stdio.h>#include<stdlib.h>#include<time.h>#include<math.h>int P[100][2];int...原创 2018-09-23 20:19:52 · 283 阅读 · 0 评论 -
不定方程求解POJ4139
#include<stdio.h>int main(){ int a,b,c; int sum=0; scanf("%d%d%d",&a,&b,&c); int n=a>b?a:b; int m=a<b?a:b; for(int i=0;i<=c/n;i++) if((c-i*n)%m==0) sum++; p...原创 2018-09-18 19:26:15 · 634 阅读 · 0 评论 -
质数的和与积POJ4138
关于质数:https://blog.csdn.net/qq_41045071/article/details/82762126#include<stdio.h>#include<math.h> int f(int num){ if (num <= 3) { return num > 1; } // 不在6的...原创 2018-09-18 18:46:39 · 2337 阅读 · 0 评论 -
数字三元组POJ4146(还没找到好方法)
#include<stdio.h>int main(){ int max=0; int n; scanf("%d",&n); for(int a1=0;a1<=n;a1++) { for(int a2=0;a2<=n;a2++) { { if((a1+a2)%2!=0) continue; } for(int ...原创 2018-09-18 18:44:52 · 675 阅读 · 0 评论 -
恼人的青蛙POJ2812
解题思路:因为要求出最长的路径,所以需要比较全部的路径长度。对于每一条路径,因为步长相等,所以只要确定开始两个被踩的点就可以求出整条路径。假设前两个点为(x1,y1),(x2,y2),则步长为dx=x2-x1,dy=y2-y1,需要判断下面三个条件是否都满足。(1)之后每个点(xi,yi)=(xi-1+dx,yi-1+dy)=(x2+(i-2)*dx,y2+(i-2)*dy),要依次判...原创 2018-09-11 21:33:26 · 840 阅读 · 0 评论 -
完美立方POJ2810
题目描述这个问题相当简单,就是枚举。唯一考虑的是它们的大小顺序。#include<stdio.h>int main(){ int N; scanf("%d",&N); int i,j,k,n; for(i=2;i<=N;i++) for(j=2;j<=N;j++) for(k=2;k<=N;k++) { if(k<...原创 2018-09-02 19:34:05 · 399 阅读 · 0 评论 -
POJ2811熄灯问题
题目描述解题思路:因为每盏灯最多只需要按下一次,考虑到数据量比较小,一共只有5*6=30盏灯,可以用枚举的方法。但是枚举所有按钮状态的次数为2^30,明显复杂度太高,需要考虑进行优化。 事实上,只用枚举第一行或者第一列按钮的状态即可。下面以枚举第一行按钮的状态为例。因为第一行灯的状态由第一行和第二行的按钮决定,所以第一行按钮的状态确定之后,为是第一行的灯全部熄灭,第二...原创 2018-09-04 22:56:12 · 971 阅读 · 1 评论 -
生理周期POJ4148
提交代码:#include<stdio.h>int main(){ int p,e,i,d; int n=1; while(scanf("%d%d%d%d",&p,&e,&i,&d)!=0) { if(p==-1&&e==-1&&i==-1&&d==-1) break;原创 2018-08-23 15:54:48 · 719 阅读 · 0 评论 -
假币问题POJ2692
解题思路:在本题中,已经明确说明塞利保证在三次称量后能够确定假币,也就是说,输入的三组称量数据有唯一的答案。硬币有三种状态:较重的假币、较轻的假币、真币。由于只有1枚假币,且总共只有12枚银币,因此可以对所有的情况进行枚举。假币可能是任意一枚,故有12种情况;且假币可能比真币重,也可能比真币轻,故有两种情况。在这全部的24种情况当中,只有一种情况能够符合三组称量数据,这就是所要寻找的答案。...原创 2018-08-16 14:46:23 · 2038 阅读 · 1 评论 -
程序执行过程计时
在分析一个程序算法时间复杂度时,可以使用统计程序或程序片段的计算时间有助于理解程序性质。许多语言或系统都提供了内部计时功能。有关c语言的如下:有关函数在time.h头文件中,在程序头部写成:#include<time.h>在程序里计时,通常写表达式:clock()/CLOCKS_PER_SEC,得到从程序开始到表达式求值时所经历的秒数。下面通过斐波那契数列来展示使用:...原创 2018-09-27 19:40:02 · 539 阅读 · 0 评论