自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Fighting

做一只勤劳的小蜜蜂,幸福才能揽入怀中。

  • 博客(18)
  • 收藏
  • 关注

原创 UVa:714 Copying Books .

最大值最小化的问题,卡了两天才做出来。入门经典上有分析,但是只提供了求最小的最大值的思路。具体方法是在某区间上用二分法猜数字,最后猜的一个数x是使得【将输入数列划分成m个连续子序列使得所有S(i)均不超过x】成立的最小x,这就是最小的最大值。这里二分的并非数组,而是一种很抽象的形式。还要好好领会。二分的区间自然是数列的最大值到数列总和。 之后的如何切分是让我最困

2013-07-31 14:21:54 710

原创 CodeForces:305B Continued Fractions

这道题很容易想到用double存下各个数,然后倒序依次求,最后比较是否相同。当然题目不会这样简单,会存在难以解决的精度问题。例如输入100    12100 1000000000000000000就会输出YES所以应该仔细分析这式子,绕过精度问题。 假如p/q等于,那么p/q-a1应该得到一个小数(或者当i=n-2时,可能得到1。想想为什么?),这个小数

2013-07-30 13:00:06 763

原创 UVa:10341 Solve It

考察二分法的题目。 二分法是很常用的查找方法,应该熟练掌握。 求导结合数据范围可以发现所给公式是单调递减的,那么可以用二分查找答案。至于无解的情况可以像解高中数学那样证明0与1两点的值同号即可。 另一点是关于小数的精度问题。(fabs(res) 二分法查找算法:当数据量很大适宜采用该方法。采用二分法查找时,数据需是排好序的。 基本思想:假设数

2013-07-29 19:31:32 636

原创 SPOJ:416 Divisibility by 15

这是一道很考察细节的题。判断一个数能否被15整除要看两个方面,一是能否被5整除,二是能否被3整除。被5整除要求个位是0或5。被3整除要求所有位的数字之和能被3除尽。这个题目有点贪心的意思,但是不太好想。在能被15整除的基础上,要求最大的这个数。对于排列的数来说,越长越好,靠前位的数字越大越好。首先我们可以将所有数字都使用,然后再按要求淘汰一些数。如何保证各位之和能被

2013-07-29 14:51:44 741

原创 HDU:4379 The More The Better

这个题目也算折磨了我一下午了。解决问题关键在于Yi + Yj   。这说明序列Y中至多有1个数字可以大于等于L/2,否则两者之和将大于L。而序列X中任意小于等于L/2都可以放进序列Y中,而大于等于L/2的至多有一个。如果有的话,那么一定是X中大于等于L/2那些序列里面最小的那一个。只要这个最小的与Y序列(即X中小于等于L/2的序列)最大的那个之和小于等于L,就能够把这个最小的放进Y中。

2013-07-28 17:22:19 677

原创 SGU:231 Prime Sum

这是个比较坑的题。无论时间还是内存卡的都很紧,也暴露出一些问题。开数组要用bool类型,因为bool只有一个字节,而int是4个字节。否则会内存超限。另外题目要求两素数之和也是素数,显然两奇数之和或者两偶数之和都是偶数,而偶数除了2都不是素数(此话不严谨),只可能是奇数与偶数的和,得到奇数才可能是素数,那么这个偶数素数肯定是2,另外一个素数(必定是奇数)需要挨个遍历了。

2013-07-27 21:01:57 849

原创 UVALive:6182 Ginkgo Numbers

其实是一道挺简单的题,比较重要的信息就是提供的第一条充要条件。依据这个可以判断【m,n】是否为【p,q】的因子。怎么找到这些符合的m,n呢?不用太多技巧,只要挨个数试可以了。这里要注意 1 m2 + n2  ,那么m或n最大是约是142,最小自然是-142,两个循环,暴力也不会超时。计算过程中有一点要注意,除数是不能为0的,所以对m2 + n2要特判非0,否则一

2013-07-27 18:47:52 1210

原创 SGU: 133 Border

也算是个区间覆盖问题吧,用贪心来做。值得注意的一点是,所有的A是不同的,所有的B也都不相同。这就意味着没有线段的左或右端点是相同的。那么线段覆盖的定义可以如下:对于两条线段X,Y,如果线段Y的左端点坐标大于X的左端点,右端点坐标小于X的右端点,那么就可以说线段Y被X覆盖了。依据线段的左端点从小到大排序,由于没有端点相同,那么显然从左往右,后一条线段的

2013-07-27 16:54:37 854

原创 UVa:10954 Add All

其实是一个贪心的题目。每次要相加的是数组里面最小的两个数,得到的结果要存到这个数组里面(原来两个数去掉),以供下次使用。直至将所有数都加过,而每次两数相加之和就是最终所求结果。为什么每次都是要最小的相加呢?COST之和最小要求每个COST都要尽量的小,那么组成COST的每部分(原数组中的数或者后来相加所得COST)也要尽量的小。要求向数组中加入新的数再使数组保持有序,显然要

2013-07-27 12:06:30 671

原创 UVa:10020 Minimal coverage

区间覆盖问题,书上有分析但还是用了好久才AC掉。用贪心法,依据每条线段的起点排序,依次扫描在线段起点小于等于区间左端点(初始为0)的前提下,选取有效长度最长(即线段终点最大)的那条线段的终点作为新区间的起点,然后继续像开始那样扫描直至所得线段终点大于等于区间右端点。线段尽量长才能保证覆盖区间尽量大,才使得所用线段尽量少,这是贪心的关键。我写的代码中有一些细节需要注意。比

2013-07-27 12:04:09 677

原创

概念:堆(英语:heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。 堆总是满足下列性质:堆中某个节点的值总是不大于或不小于其父节点的值; (在高度上保持有序)堆总是一棵完全树。 (什么是完全树) 堆的定义如下:n个元素的序列{k1,k2,ki,…,kn}当且仅当满足下关系时,称之为堆。" ki=k2i,ki>=k2

2013-07-26 20:50:09 576

原创 UVa:369 Combinations

#include#include#include#include#includeusing namespace std;long long C(int n,int k){     long double s=1.0;     for(long double i=0.0;i     {        s*=(n-i)/(k-i);     }

2013-07-26 12:19:07 879

原创 UVa:108 Maximum Sum

#includeusing namespace std;int main(){ int n; while(cin>>n) { int a[110][110]={0}; int s[110][110]={0}; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>a

2013-07-23 13:50:35 615

转载 最大连续子序列和

最大连续子序列和问题是个很老的面试题了,最佳的解法是O(N)复杂度,当然其中的一些小的地方还是有些值得注意的地方的。这里还是总结三种常见的解法,重点关注最后一种O(N)的解法即可。需要注意的是有些题目中的最大连续子序列和如果为负,则返回0;而本题目中的最大连续子序列和并不返回0,如果是全为负数,则返回最大的负数即可。问题描述求取数组中最大连续子序列和,例如给定数组为A={1, 3, -2,

2013-07-23 13:35:48 564

原创 UVa 439 Knight Moves

题意:问国际象棋棋盘上knight从一个位置走到另一个位置有多少种走法。knight可八方向移动。思路:经典的BFS问题。使用队列即可解决。#include #include #include const int N = 8;const int M = 8;const int MV[M][2]= {2, 1, 1, 2, -2, 1, -1, 2, 2, -1,

2013-07-22 22:54:08 650

原创 UVa 10405 Longest Common Subsequence

题意:求两个字符串(可能有空格)的最长公共子序列长度。思路:经典的动态规划问题。设定字符串a和b都是下标从1开始。定义dp[i][j]表示字符串a前i个字符与字符串b前j个字符的最长公共子序列长度,那么状态转移方程为dp[i][j] = 0 : if i == 0 ||  j == 0;dp[i][j] = dp[i - 1][j - 1] + 1 :  if a[i] =

2013-07-17 19:58:41 618

转载 动态规划解最长公共子序列问题

动态规划法经常会遇到复杂问题不能简单地分解成几个子问题,而会分解出一系列的子问题。简单地采用把大问题分解成子问题,并综合子问题的解导出大问题的解的方法,问题求解耗时会按问题规模呈幂级数增加。为了节约重复求相同子问题的时间,引入一个数组,不管它们是否对最终解有用,把所有子问题的解存于该数组中,这就是动态规划法所采用的基本方法。【问题】 求两字符序列的最长公共字

2013-07-17 17:28:52 729

转载 一位ACMer过来人的心得

刻苦的训练我打算最后稍微提一下。主要说后者:什么是有效地训练?       我想说下我的理解。       很多ACMer入门的时候,都被告知:要多做题,做个500多道就变牛了。其实,这既不是充分条件、也不会是必要条件。       我觉得一般情况下,对于我们普通学校的大学生,各方面能力的差距不会太大,在这种情况下,训练和学习的方法尤为重要。       其实,500题

2013-07-15 13:38:27 470

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除