算法
文章平均质量分 56
kay_zhyu
这个作者很懒,什么都没留下…
展开
-
蛇形填数
思路:很明显这个填数是有顺序的,设定了起始点是右上角,那就应该先填右边一列,再填下面一行,再填左边一列,再填上边一行。每次填一行或者一列,都是一直填数,直到下标越界或者该位置的数已经填过了,这样就跳入下一个步骤,直到填入的数大于等于n*n,这样就说明n*n的方阵已经被填满了。#include#includeint a[100][100];int main(){ int n; i原创 2013-04-11 13:26:40 · 642 阅读 · 0 评论 -
面试100题之4倒水问题
倒水问题这种智力题经常会问到,总结起来其实其实有三个类型。这几个问题先放在这里,待贫尼一个一个去攻克~~~~1、给两个水杯,容量为v1,v2,问怎么倒出体积为v的水来。水无限量。OK,成功搞定一个。链接:http://blog.csdn.net/kay_zhyu/article/details/87929402、给三个水杯,容量为v1,v2,v3,容量最大的那个水杯的水是满的,怎样倒出原创 2013-04-12 13:05:27 · 5641 阅读 · 0 评论 -
排序算法
本来以前对各种排序很熟悉的,不过好多年没弄了,陌生了。在此再过一遍,熟悉熟悉。1、快排,不稳定。算法思路:*每次选一个参考元素key,然后将数组分成两部分,左边的都小于等于key,右边的都大于等于key。void QuickSort(int *arr, int Begin, int End){ assert(arr); if(Begin >= End) retur原创 2013-04-22 20:56:18 · 876 阅读 · 0 评论 -
编程之美系列之寻找最大的K个数
题目描述:有很多无序的数,姑且家丁它们各不相等,怎么选出其中最大的若干个数呢?这里我不想去写一些很没有意义的思路。神马先排序取前k个这种弱爆了并且一点也不适用的思想我就不想废话了,因为如果数据量很大的时候,对所有数据排序肯定是费力不讨好的事情,换换思路,不能全部排序,那就部分排序吧!这里介绍两个比较实用的。当然为了有点递进关系,先来一个比较差一点的方法。如果对排序算法还不是很熟悉的,可以参考博客:原创 2013-05-01 09:39:58 · 966 阅读 · 0 评论 -
NYOJ47——过河问题(贪心)
题目描述:在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边。如果不借助手电筒的话,大家是无论如何也不敢过桥去的。不幸的是,N个人一共只带了一只手电筒,而桥窄得只够让两个人同时过。如果各自单独过桥的话,N人所需要的时间已知;而如果两人同时过桥,所需要的时间就是走得比较慢的那个人单独行动时所需的时间。问题是,如何设计一个方案,让这N人尽快过桥。输入:第一行是一个整数T(1每组测原创 2013-04-11 19:20:18 · 1046 阅读 · 0 评论 -
NYOJ71——独木舟上的旅行(贪心)
题目描述:进行一次独木舟的旅行活动,独木舟可以在港口租到,并且之间没有区别。一条独木舟最多只能乘坐两个人,且乘客的总重量不能超过独木舟的最大承载量。我们要尽量减少这次活动中的花销,所以要找出可以安置所有旅客的最少的独木舟条数。现在请写一个程序,读入独木舟的最大承载量、旅客数目和每位旅客的重量。根据给出的规则,计算要安置所有旅客必须的最少的独木舟条数,并输出结果。输入:第一行输入s,表示测试数据原创 2013-04-11 19:44:23 · 813 阅读 · 0 评论 -
NYOJ14——会场安排(贪心算法)
题目描述:学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办。小刘的工作就是安排学校小礼堂的活动,每个时间最多安排一个活动。现在小刘有一些活动计划的时间表,他想尽可能的安排更多的活动,请问他该如何安排。输入第一行是一个整型数m(m输出对于每一组输入,输出最多能够安排的活动数量。每组的输出占一行样例输入221 1010原创 2013-04-11 16:27:46 · 1109 阅读 · 0 评论 -
面试100题系列之14从1到n中随意取几个数,使其和为m
1、题目描述:输入两个整数n和m,从数列1,2,3.......n 中随意取几个数,这里同一个数不能重复取,使其和等于m,要求将其中所有的可能组合列出来。解题思路:典型的0-1背包问题,每一个数字都有两种状态,取或者不取。最简单的就是用递归求解。这里的遍历顺序是从n到1,这样比较好判断递归的出口,当然也比较方便剪枝。核心代码如下,有没有觉得很漂亮://找到1~Num中和等于Sum的所有组合原创 2013-05-03 10:16:36 · 2440 阅读 · 0 评论 -
编程之美系列之二叉树的分层遍历
关于二叉树的遍历,大家肯定都不会陌生。当然,这种题目很多人都会做,但是你们心中的解题办法是不是够漂亮呢?首先,这里需要用到的数据结构的队列,这应该没有什么疑问,先进先出嘛。子节点在父节点之后,而用队列,子节点是通过父节点入队列,所以在父节点之后,OK~符合标准!先来说说大致的一些解题思路。1、在NODE的定义中定义一个flag标记,用来记录该节点属于哪一层,然后如果当前节点的层数大于上一个原创 2013-05-01 16:42:39 · 993 阅读 · 0 评论 -
杭电ACM2147——kiki' game
Problem Description:http://acm.hdu.edu.cn/showproblem.php?pid=2147Recently kiki has nothing to do. While she is bored, an idea appears in his mind, she just playes the checkerboard game.The size of原创 2013-05-01 15:26:33 · 1117 阅读 · 0 评论 -
NYOJ91——阶乘之和(贪心)
题目描述:给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数)的阶乘之和,如9=1!+2!+3!,如果是,则输出Yes,否则输出No;输入:第一行有一个整数0每组测试数据有一个正整数n输出:如果符合条件,输出Yes,否则输出No;样例输入:2910样例输出:YesNo#includeint main(){ int a原创 2013-04-11 20:15:00 · 1307 阅读 · 2 评论 -
倒水问题1
思路分析:两个水杯,一大一小,要么用小水杯一直装满水,然后倒入大水杯中,要么一直用大水杯装满水,倒入小水杯中。这里假设每装一次水,则计数一次。最后输入两种方案下装水次数最少的方案。如果是小水杯装水,倒入大水杯中,那么就相当于用小水杯的倍数对大水杯取模,这样就得到一个循环数列。如果目标体积没有出现在这个数列中,说明这种方法不可行。同样如果是大水杯装水,倒入小水杯中,就相当于用大水杯的倍数对小原创 2013-04-12 14:00:36 · 1897 阅读 · 0 评论 -
面试100题系列之3一种关于拆分思路的算法
今天去参加腾讯的笔试,最后一道附加题。两个数组a[N],b[N],其中a[N]的各个元素值已知,现给b[i]赋值,b[i] = a[0]*a[1]*a[2]...*a[N-1]/a[i];要求:1. 不准用除法运算;2. 除了循环计数值,a[N],b[N]外,不准再用其他任何变量(包括局部变量,全局变量等);3. 满足时间复杂度O(n),空间复杂度O(1);我自己的思路:通原创 2013-04-11 12:59:54 · 923 阅读 · 0 评论 -
NYOJ21 三个水杯
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=21题目分析:暴力+BFS。将所有可能的状态压到队列中,直到找到目标状态为止。我自己AC的代码。#include#include//三个水杯的盛水的状态struct Node{ int a;//水杯1的水量 int b;//水杯2的水量 int c原创 2013-04-12 19:25:49 · 1079 阅读 · 0 评论 -
RMQ(range maximum/minimum query)算法
1、应用背景RMQ(range maximum/minimum query)算法是为了解决在一个给定的数组里面,随机的查询某一个区间中的最大或者最小值。如果只是少量的查询,直接遍历数组就可以了,当这种查询频率很高时,这样频繁的遍历数组显然是不可行的,这就需要用到这个算法。一个原则,当我们需要减少程序运行的时间,要么就是优化代码,要么就是用时间换空间。前者也就是部分的减少时间,或者说效果不是那么原创 2013-04-23 17:31:42 · 1033 阅读 · 0 评论 -
NYOJ6——喷水装置(一)(贪心)
题目描述:现有一块草坪,长为20米,宽为2米,要在横中心线上放置半径为Ri的喷水装置,每个喷水装置的效果都会让以它为中心的半径为实数Ri(0<Ri<15)的圆被湿润,这有充足的喷水装置i(1<i<600)个,并且一定能把草坪全部湿润,你要做的是:选择尽量少的喷水装置,把整个草坪的全部湿润。输入 第一行m表示有m组测试数据每一组测试数据的第一行有一个整数数n,n表示共有n个喷水装置,原创 2013-04-11 14:23:08 · 1227 阅读 · 0 评论 -
NYOJ12——喷水装置(二)(贪心算法)
题目描述:分析:这道题其实跟喷水装置的思路是一样的,不过这里需要把数据转换一下,根据以给点的坐标和半径算出该装置可以覆盖的区间。这样就把问题转化成了找出最小的区间数去完全覆盖一个给定的区间。这里做了一点优化。如果该装置连高都不能覆盖,肯定不进行考虑。将所有可以覆盖到高的装置加入数组中,用j来记录实际有多少个可用装置。然后对可用的装置进行排序,按照区间的起始点升序排列,如果起始点相同,按原创 2013-04-11 15:59:03 · 1006 阅读 · 0 评论 -
编程之美系列之关于数组的二分查找
有序的数组,其中的元素可以通过二分查找得到,可以如果一个数组是由有序数组左旋得到的,能不能还是用二分查找得到呢?答案是肯定的。为了简化问题,我先假设数组是由升序的数组通过左旋得到了,比如说{1,2,3,4,5,6}=>{4,5,6,1,2,3}。只要我们找到这个最大值的下标,那么就可以把数组分成两个升序的有序数组了。找这个最大值很简单,但是我想你应该不会说全部遍历一遍数组吧!这里讲的重点是二分原创 2013-05-01 15:19:05 · 1757 阅读 · 0 评论