
杭电OJ
文章平均质量分 55
堕落的蚂蚁
IT码农
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
杭电OJ 1381 :Crazy Search
这个题目不难,主要是看一下map的用法和string类的构造函数的使用。C++代码:#include #include #include #include using namespace std;int main(){ int T,N,NC; string text; map Stat;//定义map对象 cin>>T; while(T--){ cin>>N>>NC原创 2014-03-26 17:35:19 · 596 阅读 · 0 评论 -
杭电OJ 1014:Uniform Generator
比较简单的一个题目,要注意输出的格式(对其格式以及空格等问题),附上AC代码:#include int main(){ int a,b,r,m,n; while(scanf("%d%d",&a,&b)!=EOF){ m = a;n = b; if(a < b){ a += b;b = a -b;a -= b; } while(b > 0){ r = a %原创 2014-03-29 15:56:44 · 613 阅读 · 0 评论 -
杭电OJ 1438:钥匙计数之一
这个题目主要是数学推理。假设one[i],two[i],three[i],four[i]分别表示一共有i个槽的情况下第一个槽为1、2、3、4的情况,Lock[i]表示有i个槽的情况下锁匙的个数,容易得到Lock[i] = one[i] + two[i] + three[i] + four[i]。另外可以知道one[i]和four[i]的情况是一样多的,因为对于所有的第一个槽为1的合法情况,如果原创 2014-03-27 21:58:30 · 627 阅读 · 0 评论 -
和为S的两个数字
题目描述:输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。输入:每个测试案例包括两行:第一行包含一个整数n和k,n表示数组中的元素个数,k表示两数之和。其中1 第二行包含n个整数,每个数组均为int类型。输出:对应每个测试案例,输出两个数,小的先输出。如果找不到,则输出“-1 -1”原创 2014-03-15 23:24:27 · 485 阅读 · 0 评论 -
杭电OJ 1061:Rightmost Digit
这个题目要求n的n次方的最后一个数字,其实最后一个数字只与n的最后一个数字和多少次方有关系,由于N的值很大,所以不能直接相乘,会超时。应该采用二进制乘法。C++代码:#includeint main(){ int T,n; scanf("%d",&T); while(T--){ scanf("%d",&n); int res=1;int tmp=n%10; while(n)原创 2014-03-10 09:36:22 · 756 阅读 · 0 评论 -
杭电OJ 1220:Cube
这纯粹是一道数学题目,推理如下: 给你一个正方体,切割成单位体积的小正方体,求所有公共顶点数<=2的小正方体的对数。公共点的数目只可能有:0,1,2,4.很明显我们用总的对数减掉有四个公共点的对数就可以了。 总的公共点对数:n^3*(n^3-1)/2(一共有n^3块小方块,从中选出2块)(只有两个小方块之间才存在公共点,我们从所有的小方块中任意选出两个,自然就确定了这两个小方块的公共点的原创 2014-03-13 19:46:11 · 534 阅读 · 0 评论 -
杭电OJ 1053:Entropy
这个问题的主要难点是构建huffman树,在构建huffman树的过程中可以使用优先队列,另外在计算总的编码长度的时候用了树的遍历算法。需要注意的是如果出现的字符只有一种,这种情况要单独考虑。下面的代码还给出了指针优先队列的用法(指针优先队列和值优先队列的用法不太一样)。C++代码:#include#include#includeusing namespace std;const原创 2014-03-08 14:42:33 · 706 阅读 · 0 评论 -
杭电OJ 1051:Wooden Sticks
这个题目的大意是有一个处理木材的机器,处理第一根木材的时候需要调整,后面的木材如果长度不小于前面的木材并且重量也不小于前面的木材则机器不需要重新调整,否则就需要调整,调整一次花费的时间为1,问机器最少要调整几次?这个问题其实可以转换为求最长递减子序列。转化过程:先对多所有的木材按长度从小到大排序,然后按重量求最长递减子序列,子序列元素的个数就是机器要调整的次数,因为这个序列中的元素是不可能排在原创 2014-03-08 11:58:15 · 785 阅读 · 0 评论 -
杭电OJ 1045:Fire Net
题目的数据量比较小,直接暴力搜索就可以过。C++代码:#includeint n,maxnum=0;char map[5][5];bool check(int row,int col){ int i,j; for(i=row;i>=0;i--){ if(map[i][col]=='O')return false; if(map[i][col]=='X')break; }原创 2014-03-11 10:11:02 · 676 阅读 · 0 评论 -
题目1370:数组中出校次数超过一半的数字
题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。输入:每个测试案例包括2行:第一行输入一个整数n(1第二行输入n个整数,表示数组中的每个元素,这n个整数的范围是[1,1000000000]。输出:对应每个测试案例原创 2014-03-29 16:17:01 · 500 阅读 · 0 评论 -
杭电OJ 1007:Quoit Design
这个一个经典的利用分治算法解决的问题,这个题目其实是要求平面上很多点中距离最近的两个点的距离的一半(半径)。解决这个问题的思路是:(1)对所有的点按照x坐标从小到大排序。(2)按照x坐标将所有的点一分为二,分为左边的一半和右边一半。(2)分别求出左边一半和右边的一半的点的最小距离,假设最小距离分别为minl和minr。取minValue=min(minl,minr)。(3)对从low到原创 2014-03-29 09:06:14 · 776 阅读 · 0 评论 -
杭电OJ:1010 Tempter of the Bone
这是一道搜索的题目,题目很常规,需要注意的是剪枝函数,如果剪纸剪的不好就很容易超时。AC代码:#include char maze[8][8];int n,m,t;bool success;int go[][2]={ 1,0, -1,0, 0,1, 0,-1};void DFS(int x,int y,int time){ for(int i=0;i<4;i++){原创 2014-03-29 15:40:02 · 753 阅读 · 0 评论 -
杭电OJ 1207 :汉诺塔II
虽然本题只是在原来的汉诺塔的基础上增加了一个柱子,但是不能根据先将上面的n-2个圆盘通过C和D移动到B上,然后再将第n-1个盘子移动到C上,接着讲最后一个圆盘移动到D上(假设D是最终的位置),最后将上面的n-2个圆盘通过A ,C移动到D上,所以一共需要F[n]=2*F[n-2] + 3步;当nhttp://www.cnblogs.com/fanzhidongyzby/archive/2012/07原创 2014-03-25 11:03:13 · 966 阅读 · 0 评论 -
杭电OJ 1026:Ignatius and the Princess I
比较麻烦的一道题目,自己刚开始思路不清楚,原创 2014-04-06 10:59:27 · 724 阅读 · 0 评论 -
杭电OJ 1030:Delta-wave
这是一个完全的数学题目,主要是找规律。仔细研究可以找到如下规律:1.关于给定一个n,求其所在的层。 1层:1个数,2层:3,3层:5,4层:7,……(等差,d = 2,a1 = 1,Sn = (a1 + an)/2 = n^2) 看最右边斜列1,4,9,16,……皆为平方数。 所以n所在的层为:ceil(sqrt(n))2.关于网上的左右斜列(或斜行)。原创 2014-03-25 09:06:16 · 545 阅读 · 0 评论 -
杭电OJ 1027:Ignatius and the Princess II
题目的大意就是求一串数字的全排列的第m小的排列,比如1,2,3是3个数的最小的全排列,1,3,2是次小的全排列。这个题目可以用STL的一个函数next_permutation,这个函数是用来生成一个全排列的下一个全排列,当然也可以自己写生成排列算法,生成一个全排列的下一个全排列的算法如下:(1)从数组最后一个开始往前找,假设后一个记为p,前一个记为pre,直到找到一个满足A[pre](2)原创 2014-03-23 14:32:17 · 706 阅读 · 0 评论 -
杭电OJ 1023:Train Problem II
这个题目其实就是计算卡特兰数,但是由于数字比较大所以要用到大数运算,下面的大数代码是别人写的,自己懒得写了。#include #define MAX 54void Multiple(int n,int* des){ int i,k,temp1,temp2; temp1 = 0; for(k=MAX-1;!des[k];k--); for(i=0;i<=k;i++){ temp原创 2014-03-24 10:38:01 · 654 阅读 · 0 评论 -
杭电OJ 1022:Train Problem I
这个题目主要就是模拟出栈和入栈,其实不难就是有点麻烦。话不多说,直接上代码:#include #include using namespace std;int main(){ int n;int in[10],out[10];stack S; int result[20];char t1[10],t2[10]; while(scanf("%d\n",&n)!=EOF){ whi原创 2014-03-24 09:41:57 · 485 阅读 · 0 评论 -
杭电OJ 1098:Ignatius's puzzle
这个题目的难点不是编程,而是数学。f(x)=5*x^13+13*x^5+k*a*x=x(5*x^12+13*x^4+k*a),这个函数的形式直接就是费马小定理的形式费马小定理是数论中的一个重要定理,其内容为: 假如p是质数,且(a,p)=1,那么 a^(p-1) ≡1(mod p) 假如p是质数,且a,p互质,那么 a的(p-1)次方除以p的余数恒等于1对f(x)=x(原创 2014-04-03 10:50:56 · 637 阅读 · 0 评论 -
杭电OJ 1011:Starship Troopers
这是一道树形DP问题,答案是参考网上的。第一次接触到这种题目,没什么头绪,看到别人的解答后豁然开朗。 有 n(1典型的树上背包问题定义状态 f[u][P] 表示用 P 个士兵占领以 u 为根节点的子树所能获得的概率最大值,状态转移就是一个树形DP过程,目标状态就是 f[1][m]。f[u][p] = max {f[u][p], f[u][p - k] + f[v][k] };其原创 2014-04-01 16:18:08 · 715 阅读 · 0 评论 -
杭电OJ 1005:Number Sequence
这个题目如果使用数组或者递归都会爆栈,注意到题目中的数都是对7取余,所以相邻的两个数的组合最多有49中,所以最多49次循环就会从头开始循环,这是就可以不用继续执行了,然后将n对i取余,根据余数就可以得到结果。C++代码:#includeconst int N=55;int dp[N];int getRes(int A,int B,int n){ if(n==1||n==2) r原创 2014-03-06 19:52:50 · 925 阅读 · 0 评论 -
杭电OJ 1028:Ignatius and the Princess III
这是一个使用母函数的题目,之前听说过母函数,但是没有用过,后来查了一下资料,大概了解了一下,关于母函数的具体信息请参考:http://blog.csdn.net/lishuhuakai/article/details/8044431和http://www.matrix67.com/blog/archives/120两篇文章。C++代码:#include"iostream" using n原创 2014-03-05 20:31:32 · 640 阅读 · 0 评论 -
杭电OJ 1789:Doing Homework again
经典的贪心问题,先按照作业的扣除分数从大到小排序,如果分数相同则按截至日期从小到大排序。然后根据day判断哪些作业可以被安排。注意:for循环中如果存在一个作业符合条件就要跳出循环(因为每天只能安排一个作业)。C++代码:#include#includeusing namespace std;const int N=1001;struct homework{ int deadli原创 2014-03-11 13:55:03 · 661 阅读 · 0 评论 -
杭电OJ 1074:Doing Homework
这个题目的难点是状态压缩和DP,详细的解题过程请参考http://www.cnblogs.com/rain-lei/archive/2012/08/04/2623314.html和http://blog.sina.com.cn/s/blog_8338b9050100vvpa.html两篇文章。C++代码:#include#includeconst int MAX=1<<15;cons原创 2014-02-26 11:32:39 · 764 阅读 · 0 评论 -
杭电OJ 1087:Super Jumping! Jumping! Jumping!
题目链接地址:http://acm.hdu.edu.cn/showproblem.php?pid=1087C++代码:#include#includeconst int N=1010;int dp[N];int arr[N];int main(){ int n; //freopen("1.txt","r",stdin); while(scanf("%d",&n)!=EOF&原创 2014-02-25 12:02:13 · 561 阅读 · 0 评论 -
杭电OJ 1114:Piggy-Bank
题目链接地址:http://acm.hdu.edu.cn/showproblem.php?pid=1114这是一道完全背包问题,可以讲完全背包问题转换为01背包问题解,也可以直接求解。完全背包问题的状态转移方程为:f[i][v]=max{f[i-1][v],f[i][v-c[i]]+w[i]}。需要注意的是本题不是求最大值而是求最小值,所以初始化的时候要注意。1、转化为01背包问题的代码:原创 2014-02-24 14:33:23 · 614 阅读 · 0 评论 -
杭电OJ1025:Constructing Roads In JGShining's Kingdom
本题求得最长递增子序列,但是由于数据量很大所以要用复杂度为nlongn的方法求而不能用常规的dp方法求。C++代码:#include#includeusing namespace std;const int N=500010;struct road{ int x,y;}arr[N];bool cmp(road a,road b){ return a.x<b.x;}int原创 2014-02-23 20:41:30 · 520 阅读 · 0 评论 -
杭电 1002:A + B Problem II
A + B Problem IIProblem DescriptionI have a very simple problem for you. Given two integers A and B, your job is to calculate the Sum of A + B. InputThe first line of the i原创 2013-10-23 23:18:53 · 494 阅读 · 0 评论 -
杭电 1001 Sum Problem
这个题目看起来很简单只要使用高斯公式s=n*(n+1)/2就可以算出来,其实其中藏有陷阱。因为如果按照这样算的话,n*(n+1)的值有可能超过32bit的表示范围,所以一个有效的方法是先将n(n为偶数)除以2或者将(n+1)(n为奇数)除以2,这样就不会超过32bit的表示范围。C++代码:#includeusing namespace std;int main(){ int原创 2013-10-23 21:29:08 · 536 阅读 · 0 评论 -
杭电题目分类
1001 入门1002 简单的大数1003 DP经典问题,最大连续子段和1004 简单题1005 找规律(循环点)1006 感觉有点BT的题,我到现在还没过1007 经典问题,最近点对问题,用分治1008 简单题1009 贪心1010 搜索题,剪枝很关键10111012 简单题1013 简单题(有个小陷阱)1014 简单题1015 可以看作搜索题转载 2013-10-23 21:09:30 · 482 阅读 · 0 评论 -
杭电OJ 1000: A + B Problem
很简单的一个程序,C++代码:#includeint main(){ int a,b; while(std::cin>>a>>b) { std::cout<<a+b<<std::endl; } return 0;}原创 2013-10-23 21:00:31 · 788 阅读 · 0 评论 -
杭电OJ 1078:FatMouse and Cheese
这个题目主要是利用了深度优先搜索和dp的思想,其中value[i][j]表示从(i,j)出发可以获得的最多的chess数目。C++代码:#includeint map[110][110];int value[110][110];int dir[4][2]={0,1,0,-1,1,0,-1,0};int n,k;int dfs(int sx,int sy){ int x,y,ma原创 2014-02-27 20:29:03 · 726 阅读 · 0 评论 -
杭电OJ :1203 I NEED A OFFER!
这是一道背包问题,主要的难题是计算概率。假设A大学录取的概率为a,B大学录取的概率为b。那么没有被一所大学录取的概率为(1-a)(1-b),所以录取的概率为1-(1-a)(1-b)=a+b-a*b。递推的公式为dp[i]=max{dp[i],dp[i-arr[j]]+prob[i]-dp[i-arr[j]]*prob[i]}。C++代码如下:#include#includeconst原创 2014-02-28 23:18:18 · 1035 阅读 · 0 评论 -
杭电OJ 1016:Prime Ring Problem
这个题目主要利用的是递归搜索,从1开始搜索,不断的试探下一个数。C++代码:#include#includeconst int N=20;int arr[N];bool mark[N];bool isPrime(int n){ int k=(int)sqrt(double(n)); for(int i=2;i<=k;i++){ if(n%i==0) return f原创 2014-03-01 16:15:10 · 602 阅读 · 0 评论 -
杭电OJ 1066:Last non-zero Digit in N!
这个题目要求n的阶乘的最后一位不为0的数字,看了几个人的解题报告,不是很懂,先记下来,以后再慢慢研究。C++代码:#include #include #define MAXN 10000char n[10000];int lastdigit(char* buf){ const int mod[21]={6,6,2,6,4,2,2,4,2,8,4,4,8,4,6,8,8原创 2014-03-10 21:33:18 · 652 阅读 · 0 评论 -
杭电OJ 1060 :Leftmost Digit
C++代码:#include#includeusing namespace std;int main(){ long long T;double n; cin>>T; while(T--){ cin>>n; double a=n*log10(n); double b=a-(long long)a; int c=(int)pow(10.0,b); cout<<c<原创 2014-03-10 18:17:01 · 563 阅读 · 0 评论 -
杭电OJ 1355:The Peanuts
杭电上将题目分到了DP,但是好像直接用贪心算法就可以做出来,不知道是不是数据不够强。C++代码:#include#include#includeusing namespace std;struct peanut{ int x,y,c;}arr[5000];bool cmp(peanut a,peanut b){ return a.c>b.c;}int main(){原创 2014-03-04 09:55:49 · 528 阅读 · 0 评论 -
杭电OJ :1160 FatMouse's Speed
这是一道DP+记忆搜索的题目,题目不难,但是需要注意的是:题目虽然说的是special judge但是并不是所有正确的答案都可以AC的,比如下面的程序中的第二个for循环,如果改为从i-1到0就不能AC,遇到这种题目真是无语。C++代码:#include#includeusing namespace std;struct Mouse{ int w; int s; int pre原创 2014-03-02 13:35:15 · 885 阅读 · 0 评论 -
杭电OJ 1159 :Common Subsequence
这个题目是求两个字符串数组的最长公共子序列,是很经典的动态规划问题,详细的算法过程可以参考:http://blog.csdn.net/jiahui524/article/details/6653181。C++代码:#include#includeconst int N=1010;char arr1[N];char arr2[N];int dp[N][N];int MAX(int原创 2014-03-02 11:23:11 · 874 阅读 · 0 评论 -
杭电OJ 1106:排序
不是很难得一道题,写在这儿的原因是发现了一篇介绍很好的关于字符串分解的文章。文章地址为:点击打开连接C++代码:#include #include #include int cmp(const void* a,const void* b){ return *(int*)a-*(int*)b;}int main(){ char a[1000]; int b[10原创 2014-03-02 15:13:30 · 704 阅读 · 0 评论