- 博客(39)
- 资源 (1)
- 收藏
- 关注
原创 最大子序列和问题逐步优化从O(n^3)---O(n)
问题: 给定一个序列A1,A2,A3,........An(可能有负数),求A1~An的一个子序列Ai~Aj,使得Ai到Aj的和最大 。如整数序列-2, 11, -4, 13, -5, 2, -5, -3, 12, -9的最大子序列的和为21。 方法1:最简单的一个方法就是枚举每个子序列,然后求出每个子序列的和,再取其中的最大值;时间复杂度为n^3;代码如下:int
2014-11-29 15:09:24 740
原创 uva--11129An antiarithmetic permutation+分治
题意: 输入一个数n,求n的一个排列,要求这个排序的任意一个子序列都不能是等差数列。思路: 想了很久,但是除了枚举以外还是没想到其它的思路,枚举是一定会超时的;到网上看了别人的解题报告才知道应该用分治的方法做。 分治的思想:考虑一个等差数列,我们把其奇数项,偶数项都提取出来;显然这两个序类内部还是等差数列,但是它们之间的元素就不可能形成等差数列了;然后我们可
2014-11-29 14:28:07 721
原创 uva--11100The Trip, 2007
题意: 现在有n个不同容量的包,他们的容量用数字表示;规定小的包可以嵌套进大的包里去(但每个包只能嵌套一个包),这样安排才可以使得最后需要提的包的数目最少;在保持包的数目最少的同时,也需要使得每一个大包里面装的小包最大数目数目尽量少。思路: 开始的时候一直没想清楚最后最少的包数应该是多少;后面灵光一闪,突然就发现最后可以保留的最少包数应该就是数目最多的那种包的个数(记为cnt)。
2014-11-27 11:54:17 745
原创 java程序---将一个浮点数转换成人民币读法
代码如下:package test;import java.util.Scanner;//将输入的浮点型钱数,转成人民币读法public class Num2Rmb { private static double num; private long zheng,xiao; private String[] hanArr={"零","壹","贰","叁","肆","伍","陆"
2014-11-26 19:19:18 1894
原创 uva--10716Evil Straw Warts Live +回文串+贪心
题意: 输入一个字符串,我们可以交换这个字符串中的相邻字符;问至少经过多少步交换可以得到一个回文串;如果无论怎么交换都得不到回文串,输出“Impossible”;思路: 首先由回文串的定义和性质,可以得到两种不可能情况:1.当这个串长度为奇数时,如果出现次数为奇数次字母的数目不为1,则显然不可能。2.当这个串长度为偶数时,如果出现次数为奇数次字母的个数大于0,则不可能。
2014-11-26 18:46:08 1082
原创 uva--10720Graph Construction +Havel--Hakimi定理
这是一个定理题;定理的具体内容见:http://blog.csdn.net/shuangde800/article/details/7857246我的代码如下:#include#include#include#includeusing namespace std;int cmp(int a,int b){ return a>b;}int main
2014-11-25 21:54:25 745
原创 uva--10670Work Reduction +模拟
题意: 现在有n份工作需要做,老板要求必须一天之内做到只剩m份;你可以选择一些机构来帮你完成工作,他们的收费标准是:收费$A完成一份工作,收费$B完成你一半的工作(如果除2后有小数,则四舍五入)。输入L个这样机构的收费,你需要算出完成你工作每个机构最低的收费,并且从低到高排序后输出(费用相同,则按机构名的字典序排序)。思路: 如果剩余工作完成一半后仍大于m,我们就选择完成一
2014-11-25 18:51:57 705
原创 uva--10382Watering Grass+贪心
题意: 一片长为L宽为W的矩形草坪,然后给出n个喷头的圆心坐标和半径,问你最少需要几个喷头可以覆盖整个草坪。思路: 刚开始的时候直接觉得可以算出每个喷头可以覆盖的区间,然后就变成前面刚做过的区间覆盖问题了;后面看了一下样例,发现这样想是不对的,因为喷头边沿的圆弧可能是不能完全覆盖住草地的,所以那些地方就必须还要别的喷头去覆盖,这样就不能直接用区间合并来做了。后面又想了一下,其实每
2014-11-25 17:35:40 753
原创 uva--993Product of digits
水题一枚,如果n能分解成2--9的因子相乘的形式的话肯定是可以的,如果不行那么就直接输出-1;那么当能分解的时候,为了能使得答案的值最小,我们选择先分解大的因子;也就是按9--2的次序进行分解。分解后直接按因子从小到大输出就是答案了。代码如下:#include#include#includeusing namespace std;int main(){
2014-11-24 23:34:17 782
原创 uva--11054Wine trading in Gergovia +贪心
题意: 一条街上所有人都以卖酒为生,每一天有的人需要卖掉一些酒而有的人需要买入一些酒;然后在相邻的人之间运输一单位的酒需要一单位的花费,问怎么样安排人们之间的交易,可以使得总运算费用最小。思路: 开始就想到一个贪心思路:显然每个需要买酒的人都应该尽量买他最左边卖的酒,没有的话再买他右边最近卖酒人的酒。第二点很好理解,现在来解释一下第一点:如果当前这个人不买他最左边人卖的
2014-11-24 21:52:06 775
原创 uva--10602+贪心
题意: 某公司开发了一个编辑器,支持两条语音命令:1.重复最后一个单词,2.删除最后一个单词的最后一个字母。给你一系列的单词,问利用编辑器的功能最少需要输入多少个字母就可以将所有单词输入;要求第一个单词一定要第一个输入,其余单词不限顺序。思路: 输入第一个单词后,我们可以怎么样选择能使得输入的字母数最少?当然我们需要选择和第一个单词有最长公共前缀的单词;这就是贪心的策略:每次都
2014-11-23 22:51:08 611
原创 uva--10718+贪心
题意: 输入n,L,U,在L,U之间找一个数M使得n与M按位或的值最大,如果有多个M输出最小的那个。思路: 将数化成二进制再结合或的性质就可以很容易得到一个贪心的策略:将n化为32位的二进制表示后对于n中为0的位,使得M对应的二进制位为1.这样显然可以使得n|M值最大,但是同时还要考虑区间的限制;n中二进制为0时,M对应的二进制位取1的条件是:必须保证后面M的最小值小
2014-11-23 17:57:16 834
原创 uva--10400+dfs+回溯
题意: 输入n个正整数和一个目标值,可以在这n个数中间填充+ - × /号进行运算,运算从左到右进行,不考虑运算符的优先性。 并且给定下面的规则: 1.填充符号时n个数的顺序不能改变。 2.填充除号的时候必须保证结果为整数。 3.每一步的结果必须在-32000~32000之间。问是否可以求得目标值。思路
2014-11-23 01:22:09 1233
原创 uva--714+二分(最大值最小化问题)
题意: 原题意比较啰嗦,大概的意思就是输入n个整数,然后将他们分成m段,要求求出这m段中最大和最小时候的情况。输出的时候段与段之间用"/"分离,当有多个解时,输出第一段值最小的,第一段相同时输出第二段值最小的解,以此类推。思路: 一看到最大值最小,我就想到了二分,可以采取二分试探这个最大值,然后看是否能在这个最大值下能否分成m段,然后我们记录下二分过程中得到的那个满足要求
2014-11-21 23:48:46 845
原创 uva--10954+贪心
题意: 输入n个数将它们相加。相加的时候每次只能选择2个数,然后定义这两个数的和为这一次相加的代价。问以什么顺序相加可以使得总的代价最小。思路: 从n个数中选2个数相加后然后问题就变成了n-1个数相加了,所以我们可以采取的一个贪心策略是每次都选两个最小的数相加。具体实现的时候可以先对n个数排一下序,然后取前2个数相加,再将结果插入到原数组中(这是插入排序的思想,其实
2014-11-21 13:04:28 843
原创 uva--10714+找规律
题意: 一根长度为len的木棍上有n只蚂蚁,蚂蚁们都以1cm/s的速度爬行;如果一只蚂蚁爬到了木棍的端点,那么他就会掉下去;如果两只蚂蚁碰到一起了,他们就会掉头往相反方向爬行。输入len和n只蚂蚁的初始位置(以左端点为原点),问:所有蚂蚁都掉下木棍的最短时间和最长时间(蚂蚁初始爬行方向是不定的)。思路: 最短时间是很显然的,只要靠近左端点的蚂蚁都往左端点爬,靠近右端点的蚂蚁
2014-11-20 20:26:36 1256
原创 vi学习(1)
今天下午看了一下vi的常用操作,现在记录下来,方便以后查询。按vi的模式,命令分为3个部分。(一) 一般模式下 字符操作:上下左右箭头(或kjhl)可以实现光标上下左右移动一位。如果想要进行多次移动,可以使用数字+相应的操作符(如:30j表示向下移动30行)。 :x,X;x表示向后删除一个字符,X表示向前删除一
2014-11-20 18:56:45 1080
原创 uva---10020+贪心
区间覆盖问题,刘汝佳小白书P154页有详细思路;代码如下:#include#include#include#includeusing namespace std;typedef struct{ int x,y;}P;P p[110000];int cmp(P p1,P p2){ if(p1.x==p2.x)
2014-11-20 11:58:29 884
原创 uva--311+贪心
题意: 货物和箱子是等高的,然后货物的尺寸有1×1,2×2.。。。。6×6六种,箱子的尺寸统一是6*6的。给定6种货物每种的数量,然后求将它们全部装箱所需要的最小箱子数。思路: 显然要想箱子数最小,就要尽量把每个箱子都装满,那么我们可以每个箱子都选择先装大的,然后再填充小大(因为装了大的可以填充小的,而装了小的确不一定能再装进大的了)。 具体的:每个6*6的货物肯定要
2014-11-20 00:06:55 620
原创 uva--10026+贪心
题意: 一个鞋匠要做n双鞋,每一双鞋需要花费的时间是t;鞋匠每天只能做一双鞋,如果一双鞋没有按时完成,则每耽误罚款s。现在依次输入n双鞋所需要的时间和罚款,求一个罚款最小的安排。思路: 开始觉得可以将罚款多的放在前面做,但后面发现这种贪心策略是不正确的。后面考虑了一下,可以按每双鞋s/t从大到小进行一个排序如果值相同则编号小的放前面(因为他要求输出最小字典序的答案
2014-11-19 14:20:15 628
原创 uva--10700
题意: 输入一串只含有+和*号的表达式,可以通过添加括号来改变表达式的值,求表达式的最大最小值。思路: 表达式中的数都是不大于20的正整数,由a*b+c先算加法后算乘法时表达式的值最大。 由这个思路,我先把表达式中的运算符和数字都提取出来放在栈中,然后根据两种情况进行计算。可以写出代码后WA了无数次就是过不了。。。。。。 下面的AC代码是看了别人的题
2014-11-18 21:33:17 729
原创 java数组初步学习
package test;import java.util.Arrays;public class Lkl { //java中的数组 public static void main(String[] args){ /* //数组定义与静态初始化 //所谓静态初始化,即定义时就指定初值,方式有下面二种
2014-11-17 20:05:47 550
原创 uva--10282+hash
题意: 给定一个英文单词和另外一种语言单词的对照表,然后再每次给定一个另一种语言的单词,询问是否有对应的英文单词与其对应,如果有的话输出那个英文单词,否则输出“eh”.思路: 这道题以前用map做了一次,这次用的是
2014-11-07 14:30:37 602
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人