雕刻时光

just do it……nothing impossible
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

随笔分类 -  贪心专辑

摘要:求序列的最长子序列中不可分割元素的数目。不可分割元素,肯定属于某一个最长子序列,首先做的就是把属于最长子序列的数提取出来,减小查找范围。怎么提取?可以用LIS(最长递增子序列)和LDS(最长递减子序列)。对序列,从前往后,求以每个数 a[i] 为底最长子序列数组index。从后往前,求以每个数a[i]为底的最长递减子序列数组index2。线扫一遍,如果index[i] + index2[i] == length+1(length表示最长子序列的长度),那么这个数就是属于某一个最长子序列的。 提取出来以后,对每个数a[i],看它所对应的index1[i] 在整个数组中出现几次,如果只出现一次,. 阅读全文

posted @ 2013-10-30 22:24 huhuuu 阅读(420) 评论(0) 推荐(0) 编辑

摘要:题目意思比较简单,按财富,年龄,姓名来排序看似挺普通的,但被坑了20多次TLE首先排序只要一次,就是按题目规定的进行排序然后在查询的时候,不是从头扫到尾看是否符合年龄的限制,而是记录这个年龄组在数组中的起始结束位置是多少,AC#include#include#include#include#include#includeusing namespace std;struct data{ char name[19]; int age; int worth;}s[100099];int ageFrom[209],ageEnd[209];int cmp(data x,data y){... 阅读全文

posted @ 2013-10-12 21:45 huhuuu 阅读(381) 评论(0) 推荐(0) 编辑

摘要:面试中比较多会出序列有关的面试题,所以就总结下(1)一个长度N为的序列,求前K小的数 1.排序 N*log(N) 2.最大堆N*log(K) 3.有平均时间复杂度O(n)的算法,因为我们可以在O(n)的时间内找到未排序数组里面第k小的数的值,然后再遍历一下数组,把值小于等于第k小的全都输出(感谢huangnima)(2)有两个长度为N的有序序列A和B,在A和B中各任取一个数可以得到N^2个和,求这N^2个和中最小的N个。 1.比较直观的想法是将A与B的数字相加后排序,时间复杂度O(N*N*log(N*N)) 2.考虑到要求的是求最小的N个数字,所以从这里考虑优化,维护一个大小为N... 阅读全文

posted @ 2013-10-05 20:13 huhuuu 阅读(1562) 评论(6) 推荐(0) 编辑

摘要:http://ac.jobdu.com/problem.php?pid=1534给定两个整型数组A和B。我们将A和B中的元素两两相加可以得到数组C。譬如A为[1,2],B为[3,4].那么由A和B中的元素两两相加得到的数组C为[4,5,5,6]。现在给你数组A和B,求由A和B两两相加得到的数组C中,第K小的数字。对于每个测试案例,输入的第一行为三个整数m,n, k(1#include#includeusing namespace std;long long a[109999];long long b[109999];long long n,m;long long cmp(long long a 阅读全文

posted @ 2013-09-13 22:04 huhuuu 阅读(1169) 评论(0) 推荐(0) 编辑

摘要:http://www.bnuoj.com/bnuoj/problem_show.php?pid=10787下电影的时间所用最少是多少做法:贪心每部电影全速下载所需要的时间的最大值和所有电影同时满速下载的时间,两者取大View Code #include<stdio.h>long long gcd(long long a,long long b){ if (b==0) return a; else return gcd(b,a%b);}int main(){ long long n,m; while(scanf("%lld%lld",&n,&m)! 阅读全文

posted @ 2012-04-08 22:24 huhuuu 阅读(226) 评论(0) 推荐(0) 编辑

摘要:难点不在贪心,在于对字符串的处理,字符串处理为数字sscanf就可以了View Code #include<iostream>#include<algorithm>#include<stdio.h>#include<string.h>#include<math.h>using namespace std;struct data{ double x,y; int time;}s[100009];double dis[100009];double fdis(double x0,double y0,double x1,double y1){ 阅读全文

posted @ 2012-03-15 21:42 huhuuu 阅读(175) 评论(0) 推荐(0) 编辑

摘要:http://poj.org/problem?id=3040注意到这么一句话where each denomination of coin evenly divides the next-larger denomination想到贪心,排个序,从高往下取同时加个最小公倍数的优化时间0msView Code #include<iostream>#include<algorithm>#include<string.h>using namespace std;int hash1[21];struct data{ int v,b;}s[29];int cmp(dat 阅读全文

posted @ 2012-02-13 22:06 huhuuu 阅读(480) 评论(0) 推荐(0) 编辑

摘要:区间覆盖最小代价由于N<=10000排序后想到N*N的遍历不断更新add[i](表示到i最小代价)里的值,使之最小View Code #include<stdio.h>#include<iostream>#include<algorithm>using namespace std;const int maxint=999999999;struct data{ int ll,rr,c;}s[10009];int add[10009];int cmp(data a,data b){ if(a.ll==b.ll) return a.rr<b.rr; e 阅读全文

posted @ 2012-02-08 16:52 huhuuu 阅读(332) 评论(0) 推荐(0) 编辑

摘要:有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。不是圈的话,就像平分纸牌,加了个圈的话假设平均数是x,且a1给an了k个(k<0说明是an给a1了k个),那么总代价就可以算出来:令si=sum(a1..i)-ix,则总代价=sum|si-k|。易知k为中位数时此值最小。问题转化为求中位数……View Code #include<stdio.h>#include<iostream>#include<algorithm>#include<math.h>using namespace std;in 阅读全文

posted @ 2012-02-05 20:59 huhuuu 阅读(1694) 评论(0) 推荐(1) 编辑

摘要:http://www.rqnoj.cn/Problem_62.html 有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若于张纸牌,然后移动。 移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N-1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。 现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。 例如 N=4,4 堆纸牌数分别为: ① 9 ② 8 ③ 17 ④ 6 移动3次可达到目的: 从 ③ 取 4 张牌放到 ④ (9 8 13 ... 阅读全文

posted @ 2012-02-05 19:24 huhuuu 阅读(388) 评论(0) 推荐(0) 编辑

摘要:给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b。中位数是指把所有元素从小到大排列后,位于中间的数。Sample Input7 45 7 2 4 3 1 6Sample Output4HINT第三个样例解释:{4}, {7,2,4}, {5,7,2,4,3}和{5,7,2,4,3,1,6}N<=100000思路:把小于中位数的数设为-1,大于的为1,等于的为0,ll=1表示该数位置在中位数的左边sum【i】数组记录1到i数的和统计sum[]中为0的数如sum :1(ll) 2(ll) -1(ll) 0 -1 -1 1 0有1个在统计sum位置左右相减为0的数又三 阅读全文

posted @ 2012-02-05 14:47 huhuuu 阅读(904) 评论(0) 推荐(0) 编辑

摘要:先排序42 102 113 203 21在用优先队列,按价值小的优先,day<=s[i].d入队,队列的容量要<=day,如>day,出队View Code #include<stdio.h>#include<algorithm>#include<iostream>#include<queue>using namespace std;struct data{ long long d; long long p;}s[100009];struct data1{ long long d; long long p; data1(data 阅读全文

posted @ 2012-02-04 18:26 huhuuu 阅读(419) 评论(0) 推荐(0) 编辑

摘要:http://poj.org/problem?id=2376题目:问有N头牛,每头牛的工作时间不同,要工作T小时,最少需要几头牛工作思路:一开始以为排序就可以过了,TLE了两次,25000*25000不优化会超啊,果断另开一个数组,把排序后最优的数据放进去再选择如1 41 92 7其实优化下就剩下1 9View Code #include<stdio.h>#include<iostream>#include<algorithm>using namespace std;struct data{ int ll,rr;}s[25009],end[25009];in 阅读全文

posted @ 2011-12-07 21:11 huhuuu 阅读(362) 评论(0) 推荐(0) 编辑

摘要:最小的整数(HD版)时间限制 : 1000 ms 内存限制 : 100 MB提交次数 : 60 通过次数 : 5题目描述还记得上次新生赛的题目《最小的整数》么,这次题意有少许更改,但是基本题意还是不变的,数据量有所增加,做好心里准备喽。有一个整数(为n位数),你可以在这个数上去掉任意位,剩下的位置不变,比如123458 ,去掉第3位(从右往左第三位)留下12358,问用这种方法修改这个数直到只剩下一个m位整数,问最小的m位数是多少?我给的数据第一位不会是0。输入描述 测试数据有多组(大约100组),每组两行数据 ,第一行为两个整数 n,m(0<m<n<1000000),第一个 阅读全文

posted @ 2011-12-04 22:33 huhuuu 阅读(353) 评论(0) 推荐(0) 编辑

摘要:题意:给你一个建筑物群的轮廓,求该建筑物群最少由几栋楼房组成(楼房是矩形)思路:贪心一看数据范围怎么大,搜索神马的就算了从后往前扫,将符合的都标记掉(注意高度为0的没有楼房)View Code #include<stdio.h>#include<string.h>const int N=50009;struct data{ int x,y;}s[N];bool used[N];int main(){ int n,w; while(scanf("%d%d",&n,&w)!=EOF) { int i,j; for(i=1;i<=n; 阅读全文

posted @ 2011-12-02 15:39 huhuuu 阅读(368) 评论(0) 推荐(0) 编辑

摘要:http://poj.org/problem?id=3279一般都玩过的游戏翻转快,一块砖块翻开,其他周围四块跟它自己变的颜色相反如果直接搜索的话,2^(15*15)铁定超时了其实只要枚举2^15第一行,然后在此基础上贪心即第一行为map[1][j]==1,下面也为 1View Code #include<stdio.h>#include<iostream>#include<algorithm>#include<string.h>#include<cmath>using namespace std;int n,m,ret=0;bool 阅读全文

posted @ 2011-11-29 21:56 huhuuu 阅读(197) 评论(0) 推荐(0) 编辑

摘要:貌似只要一次更新就行了我一开始暴力枚举更新,重复1100大循环貌似就会都符合所有的约束其实每次在区间【a,b】,【a+1,b-1】每个数减一就行了同时注意重复区间不要算在内。。。View Code #include<stdio.h>int s[10009];bool hash[10009][10009];int main(){ int n,th,max,m; while(scanf("%d%d%d%d",&n,&th,&max,&m)!=EOF) { int a,b,i,j; for(i=1;i<=n;i++) { ... 阅读全文

posted @ 2011-11-23 16:57 huhuuu 阅读(251) 评论(0) 推荐(0) 编辑

摘要:http://poj.org/problem?id=3045贪心,按Wi+Si排列对于最后一个位置,risk=W总-Wn-Sn,使得risk最小的是最大的(Wi+Si)。View Code #include<iostream>#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;struct data{ int w,p; long long all;}node[50009];int cmp(data a,data b){ return (a.p+a.w) 阅读全文

posted @ 2011-11-18 21:09 huhuuu 阅读(173) 评论(0) 推荐(0) 编辑

摘要:如123321 保留4个数字最小结果为1221线性算法:先在1-3个之间找,记录ri再到ri+1-4之间找。。。View Code #include<stdio.h>#include<string.h>char ss[60009];int main(){ while(scanf("%s",ss)!=EOF) { int i,len,end,ri=0; len=strlen(ss); int add,app=0; //scanf("%d",&add); add=6;... 阅读全文

posted @ 2011-11-09 21:13 huhuuu 阅读(394) 评论(0) 推荐(0) 编辑

摘要:给你一个n个数的数列,其中某个数出现了超过n div 2次即众数,请你找出那个数。由于数据Memory Limit:1 MB开数组开不了,两个不一样的时候,抵消即可View Code #include<stdio.h>int main(){ int n; while(scanf("%d",&n)!=EOF) { int i,add=0,temp,bef; for(i=0;i<n;i++) { scanf("%d",&temp); if(add==0) { ... 阅读全文

posted @ 2011-10-23 18:12 huhuuu 阅读(275) 评论(0) 推荐(0) 编辑