
坚持算法
文章平均质量分 66
进击的小菜
这个作者很懒,什么都没留下…
展开
-
pku1001
这段时间面试,国考,回家。。哎 终于开始研究算法题目了。题目就不放了。。pku1001,可以去网站上看,大体说下思路吧。一、大数乘法:方法是用两个字符数组来存储(这个地球人都知道),但在算的时候有个小技巧,用相应的整数数组来存储结果,之后在转换回去,而为了进位,在存储运算结果时需要位置坐标+1。说的不太清楚,看下面代码就会了解。二、由于题目中对输出的结果有限制,必须分清小数点的原创 2013-12-31 18:46:29 · 742 阅读 · 0 评论 -
pku1016
这是一道水题,关键读懂题目和注意分类讨论。直接上代码。#include#includeusing namespace std;int main(){ string source; string *change = new string[15]; string temp; int key[10]; bool inventory,sinventory,linventory; wh原创 2014-02-18 21:04:37 · 435 阅读 · 0 评论 -
pku 1014
题目,,,#includeusing namespace std;unsigned short flag[7];unsigned short cut[6] = {0,1,6,14,40,45};bool divide = false;void recurve(int sum,int begin){ if(divide || sum <0 || begin <1) return;原创 2014-02-18 15:23:45 · 498 阅读 · 0 评论 -
pku1015
非常典型的动态规划题目,用别的方法会超时。题目大意是说在n个人中选取m个人做为陪审团,而每个人有D和P两个值(最大为20最小为0),选出陪审团的规则是:假设选出m个人的陪审团,要求其中所有人的D-P的绝对值为最小,如果有相同的,则需要D+P最大。用动态规划首先要找出状态,设f(m,k) = max,表示m个人,k为其D-P的最小值,max为D+P的最大值。则状态转移方程:f(m-1,k))原创 2014-02-18 14:32:37 · 567 阅读 · 0 评论 -
pku 1024
题意:#include#include#includeusing namespace std;struct node{ int x; int y;};node node1[9000],node2[9000];bool visit[101][101];int s[101][101],d[101][101];//0,1,2,3分别代表上下左右int direct[101][原创 2014-02-27 19:12:18 · 527 阅读 · 0 评论 -
pku 1023
题意。。。#includechar s[65];int main(){ int n,m; long long int number; scanf("%d",&n); while(n >0){ scanf("%d%s%lld",&m,&s,&number); for(int i = m-1;i>=0;--i){ if(number%2 ==0){ s[i] =原创 2014-02-27 18:43:53 · 555 阅读 · 0 评论 -
pku 1021
题意。。#include#includeusing namespace std;int map[101][101],x[10000],y[10000],a[10000],b[10000];int main(){ int n,width,height,m; cin>>n; while(n>0){ cin>>width>>height>>m; memset(map,0,siz原创 2014-02-27 18:33:41 · 567 阅读 · 0 评论 -
pku1020
行的做法。#includeusing namespace std;int cake[11];int row[41];int side,num;bool cancut(int begin){ if(begin == num) return true; int i; for(i =0;i<side;i++){ if(row[i] == side) continue;原创 2014-02-22 21:27:11 · 464 阅读 · 0 评论 -
pku1018
题目。。#include#includestruct manu{ int band; int price;};manu Manu[101][101];int mm[101];int band[101*101];double maxBP;int main(){ int n,m; scanf("%d",&n); while(n != 0){ scanf("%d",&m)原创 2014-02-22 11:19:25 · 470 阅读 · 0 评论 -
pku1019
1~9:每次增加一位,那么占的总位数为4510~99:每次增加二位,那么占的总位数为9000100~999:每次增加三位,那么占的总位数为13878001000~9999:每次增加四位,那么占的总位数为18979200此时总的位数为45+9000+1387800+18979200 = 20376045 214748364710000~99999:每次增加5位,那么占的总位数为2原创 2014-02-22 11:28:31 · 445 阅读 · 0 评论 -
pku1012
既然题目中提到了约瑟夫环,就先考虑其规律。假设每个人都存储在数组中,a[0],a[1]...a[n-1],共有n个人,每次走m步,则第一轮出局的人坐标为(m-1)%n,第二轮的出局的人为(m-1+第一轮人出局的坐标)%(n-1)。。。。可以得到规律,第i轮出局的人坐标为f(i) = (m-1+f(i-1))%(n-i+1)。回到原题,k个好人,k个坏人,先出去k个坏人,那么前k轮每轮出局的人的原创 2014-01-19 17:18:19 · 525 阅读 · 0 评论 -
pku1011
很经典的一道回溯题目,注意要大幅度剪枝,否则时间会超时。首先要明白要组成的棍的最小长度,肯定能被长度总和整除,且如果大于总长度的一半时还没找到这个最小值,那答案只能是总长度了。回溯需要知道目前的棍的最小长度和棍的数量(总数/长度=数量),然后如果满足条件:即所有的木棍能按照当前棍的最小长度组合成棍的数量,即找到解。回溯过程如下图所示:但剪枝是很重要的,在代码中都已经注释出来。原创 2014-01-19 17:03:28 · 555 阅读 · 0 评论 -
pku 1010
首先题目描述很让人费解,看了好久才懂。。。这篇文章对题目的意思描述很清楚http://blog.youkuaiyun.com/huxin2007/article/details/6766074之后就是代码了,基本思想是回溯+剪枝。但自己在输出全都正确的情况下是wrong answer,,,找了一天,原来是一个bool变量没有置(在代码中已经注释出来了)。#include#includeusing原创 2014-01-13 21:18:49 · 517 阅读 · 0 评论 -
pku1013
标记#include#include#includeusing namespace std;string Left[3],Right[3],result[3];string a ="ABCDEFGHIJKL";bool isnotlight(int num){ for(int i =0;i<3;i++){ if(result[i] == "even"){ if(Left原创 2014-01-23 13:48:25 · 452 阅读 · 0 评论 -
pku1007
关键是统计字符串的逆序然后根据逆序数排序输出字符串。其实也是比较基本的,但网上很多统计逆序是O(n*n)的解法,可以采用分治法统计逆序,过程类似于二路归并排序,时间复杂度是O(n*lgn)。对逆序的数目进行排序自己写了个快排。。就当是复习一下。#include#includeusing namespace std;struct DNA{ string s; int原创 2014-01-04 20:05:59 · 460 阅读 · 0 评论 -
pku1009
此题一个个算像素的值会超时,所以要寻找规律。注意到有很多都是连续相同的值,所以要考虑什么时候值会发生变化,然后得出结果。从位置1到与它相邻的位置2值发生变化,肯定有一个输入值变化了。如果用编程来解的话,就是输入值变化时,计算其影响到的相邻八块的值及其本身的值,思路和另外一篇博客类似。http://blog.youkuaiyun.com/xudacheng06/article/details/6711419原创 2014-01-10 13:48:40 · 580 阅读 · 0 评论 -
pku1006
http://poj.org/problem?id=1006其实这是水题,关键是读懂题意。。。#includeusing namespace std;int main(){ int p,e,i,d; int n =1; cin>>p>>e>>i>>d; while(true){ if(p == -1 && e == -1 && i == -1 &&原创 2014-01-04 10:51:13 · 517 阅读 · 0 评论 -
pku1002
题目比较水,但是可以练练手,这里用map模板来实现重复计数,也可以用hash实现,用string的hash算法,就是太麻烦了,,#include#include#includeusing namespace std;char mapstr[] = "22233344455566670778889990";int main(){ int n; map newmap;原创 2014-01-01 19:20:07 · 565 阅读 · 0 评论 -
pku1017
大意是说:将1*1,2*2,3*3,4*4,5*5,6*6的盒子放入6*6的盒子中,最少需要多少盒子?典型的贪心算法,先放6*6,5*5,4*4的,5*5剩下的只能放1*1的,而4*4放剩下的先放2*2,不够再放1*1的。。具体看代码:#includeusing namespace std;int main(){ int n1,n2,n3,n4,n5,n6; int sum原创 2014-02-20 12:04:48 · 477 阅读 · 0 评论