- 博客(73)
- 资源 (3)
- 收藏
- 关注
原创 NEFU OJ36 Magic Tree
可以用dp,但有两个dp数组,而且是三维的,原谅我dp知识的匮乏。。以后补上更具体说明#include#includeint maxs(int x, int y){ if (x > y) return x; else return y;}int main(){ int dp[1002][32][2]; int tree[1002]; int mint, st
2016-09-26 10:07:40
343
原创 NEFU OJ35 Grids
没什么算法。知识点:比较两个double的大小,相减之后是否小于固定值,如1e-10直接穷举,执行2500*1000=250万次会超时吗?应该不会,现在的处理器至少每秒执行个一两千万次乘法应该没问题#include#include#includebool flag[50][50];int num;double r;double x, y;const double ex
2016-09-23 14:52:50
295
原创 NEFU OJ 34 Triangle
关键:1.如果点在三角形内,则轮流和三角形中的三个点中选两个点,组成的三角形面积,和等于原来的三角形 2.分析集合中,知道三角形三个点的坐标,求面积 出错:在题目中给的某个case中,可以看到如果在三角形的边上,不算是在其内部的#include int mianji(int x1,int y1,int x2,int y2,int x3,int y3){ int sum =
2016-09-22 11:35:59
396
原创 NEFU OJ33 Fair Number
很基础的题目,主要是字符(A-F和a-f转换为整数)#include char a[251];int getvalue(char a){ if(a >='A' && a<='F') { return (a-55); } else if(a >='a' && a<='f') { return (a-87); } else { return (a-'0');
2016-09-22 10:18:39
439
原创 NEFU OJ30排序
自己写了个快排。。用库中的排序函数sort()应该也可以,但就失去题目的意义了#include int a[10];void quicksort(int beg,int end){ if(beg >=end) return; int key = a[beg]; int i = beg,j=end; while(i<j) { while(a[j] >= key &
2016-09-21 17:17:08
964
原创 NEFU OJ29 苍之涛-求和
就是1到n求和,但为什么会写写呢...因为数据类型不对也AC不了啊64位正整数用什么?unsigned long long#include int main() { unsigned long long n,sum; while( scanf("%llu",&n) != EOF ) { sum = (1+n)*n/2; printf("%llu\n",sum);
2016-09-21 16:53:14
215
原创 NEFU OJ 28月之数
关键是寻找规律,dp[i]表示位数为i+1的月之数用到dp的思想#include int dp[20];int main() { dp[0] = 1; int temp; for(int i = 1;i<20;++i) { temp = (1<<(i-1)); dp[i] = (temp+dp[i-1])*2-temp; } int m,n; while(
2016-09-21 16:36:44
288
原创 NEFU OJ 27 数列异形
直接求1000000000个是超时的。主要是寻找规律,如果觉得麻烦,用代码来输出,规律是:8,1,1,10,0,6,8,4,5,1代码如下#include int a[10]={8,1,1,10,0,6,8,4,5,1}; int main() { unsigned long int n; while( scanf("%d",&n) != EOF ) {
2016-09-21 15:48:27
240
原创 NEFU OJ26 计算阶乘位数
#include #include #includeusing namespace std;int digit(int n){ double d = 0; for(int i =1;i<=n;++i) { d += log10((double)i); } return (int)(d+1);}int main() { int m
2016-09-21 13:39:13
312
原创 NEFU OJ 25 计算高手
没有算法。关键:scanf接收字符串不能带空格。用gets char*字符串,strcmp才能比较比较#include #include using namespace std;char a[6];char b[81];int main() { char cmpa,cmpb; int result; while(1) { if(gets(a)
2016-09-21 12:51:30
479
原创 NEFU OJ 24 围数
很简单的一道题目,直接代码#include #include using namespace std;#define INT_MAX 0x7fffffff#define INT_MIN 0x80000000int main() { int x,y; int minx,miny; int maxx,maxy; minx = miny = INT_MAX; ma
2016-09-21 11:37:10
254
原创 NEFU OJ23
杨辉三角之前有道一样的题目,西游记之三角。分析就算了,题目比较简单#include #include using namespace std; int a[30][30];void getSanjiao(){ a[0][0] = 1; a[1][0] = a[1][1] = 1; for(int i =2;i<30;++i) { a[i][0] = a[i][i
2016-09-19 15:50:42
293
原创 NEFU OJ21最长上升子序列
仍然用dp,因为最长上升字序列是最优问题,而且保证最优解由最优子解构成数组为a[n],解为dp[n]dp[i]表示以a[i]结尾的最长上升子序列长度i的范围:[0-j),如果a[j] > a[i],则存在上升子序列dp[i] +1,求最长则得d[j]。注意不一定dp[n-1]是最长的,所以还要求d[n]中最大值。#include #include using names
2016-09-19 11:51:59
250
原创 NEFU OJ20
用dp的思想,递归肯定超时#include #include using namespace std; int n,times;int dp[16][16];int main() { int time,n; dp[0][0] = 0; for(int i =0;i<=15;++i){ dp[0][i] = 1; dp[i][0] = 1; } for(
2016-09-19 11:22:43
292
原创 NEFU OJ 18滑雪
dp思想:每个最优解都和子最优解有关,数组存储每个步骤的解dfs:遍历方法的改变,输入数据是不规则的,不能按照之前的dp思路访问,而是类似于图的遍历#include #include using namespace std; int a[100][100] = {0};int dp[100][100] = {0};int dx[4] = {-1,0,0,1};int
2016-09-14 10:53:07
354
原创 NEFU OJ17数字三角形
一道简单的动规题目,理解题意既可。dp[i][j] = ((dp[i-1][j]>dp[i-1][j-1])?dp[i-1][j]:dp[i-1][j-1])+ a[i][j] 这里出错了,是a?b:c运算符优先级的问题。#include #include using namespace std; int a[101][101] = {0};int dp[101][101]
2016-09-14 09:18:32
259
原创 NEFU OJ16 Function Run Fun
简单dp问题,求出所有解。如果直接递归会超时#include #include using namespace std; int w[21][21][21];void getValue(){ for(int i =0;i<21;++i) { for(int j =0;j<21;++j) { for(int k =0;k<21;++k) {
2016-09-12 17:32:12
236
原创 NEFU OJ14 蟠桃记
不多说,上代码#include#includeusing namespace std;int a[30];void getTaozi(){ a[0] =1; for(int i=1;i<30;++i) { a[i] = (a[i-1]+1)<<1; }}int main(){ int n; getTaozi(); while(scanf("%d",&n)
2016-09-12 12:06:42
252
原创 NEFU OJ12 西游记之三角形
#include#includeusing namespace std;int a[466];void getSanjiao(){ a[2] = a[1] = a[0] = 1; for(int i =3;i<=30;++i) { int left = (1+i-1)*(i-1)/2; int bleft = left-i+1; int pos = left; a
2016-09-12 11:42:50
325
原创 NEFU OJ11 寻找吕布
超时,待解决..#includeint main(){ int a[5]; while(true) { int maxa,maxb,sum; for(int i =0;i<5;++i) { scanf("%d",&a[i]); if(i ==0) { maxa = a[i]; } else { if(maxa < a[i]
2016-09-08 17:58:31
267
原创 NEFU OJ10 密码
关键:char转ASCII码值来判断#include#include#includeusing namespace std;int main(){ int n; string s; scanf("%d",&n); while(n>0) { cin>>s; bool b1,b2,b3,b4; b1 = b2 =b3 =b4 =false; int len =
2016-09-08 17:20:00
293
原创 NEFU OJ9 喜羊羊
其实就是等差数列求和,关键是注意项数怎么得到#include#includeusing namespace std;int main(){int n,m,k;while(scanf("%d%d%d",&n,&m,&k) != EOF){//项数int num = (m-n)/k+1;//等差数列求和int sum = n*num+((num*
2016-09-08 15:46:09
208
原创 NEFU OJ8 二倍的问题
排序后寻找符合条件的通过代码如下:#include#include#include#includeusing namespace std;int laber[16];int main(){ int n,len,tempa; int result; cin>>n; while(n>0) { len= 0; result =0; w
2016-09-08 14:34:12
277
原创 NEFU OJ7计算整数个数
#include#includeusing namespace std;int a[100];int b[100];int main(){ int n,len,tempa; cin>>n; while(n>0) { memset(b,0,sizeof(b)); cin>>len; for(int i =0;i<len;++i) { cin>>a[i];
2016-09-08 09:37:59
302
原创 NEFU OJ6 通宵教室
首先看看灯的状态分析: 比如第六盏灯,分别有1,2,3,6个人进来,是关的 第九盏灯,分别有1,3,9个人进来,是开的 第12盏灯,分别有1,2,3,4,6,12人进来,是关的 第16盏灯,分别有1,2,4,8,16人进来,是开的 。。。 可以看到,灯序号有奇数个因数是开的 什么是有奇数个因数的?分析一下:比如12,因数都
2016-09-07 17:48:24
273
原创 NEFU OJ5 An interesting problem
题目: 有n位数d1d2d3...dn,如果将最后一位数dn移到首位,即dnd1d2d3...d(n-1),且 dnd1d2d3...d(n-1) = dn*d1d2d3...dn,则称这个数满足条件。 输入dn和k,求出尾数为dn的满足条件的第k个数。 目前只想到大数来做,但超时。暂时没有
2016-09-07 16:50:13
323
原创 NEFU OJ3 K-Matrix
很经典的一道问题,必须求出每个子矩阵的解。有些类似动态规划的思想,a[i][j]表示o-i行,0-j列元素的值,通过它求出每个子矩阵的值。#include#includeusing namespace std;int a[51][51] = {0};int main(){ int n,sum,x,result,flag; while(cin>>n>>sum) { flag
2016-09-06 17:18:06
292
原创 NEFU OJ 2 猜想
关键点:合数:可以分解成任意质数的乘积求出质数表,然后处理输入#include#includeusing namespace std;#define SIZE (1<<24)int sushuVec[1080000] ;bool sushuB[SIZE+1];int totalnum;void getSushuVec(){ totalnum = 0; mem
2016-09-06 15:08:18
215
原创 不用if 、for等判断语句和乘除法求1+2..+n的值 &&不用加减乘除求两个数的和
11#includeusing namespace std;class Temp{public: Temp(){ ++N; SUM += N; } static void Reset(){ N=0;SUM=0;} static int GetSum(){return SUM;}private: static unsigned int N; static unsigne
2014-03-17 13:16:27
833
原创 n个骰子,求所有可能和出现的概率&&约瑟夫环
11#include#include#include#includeusing namespace std;void basegetdicechance(int *totalsum,int current,int sum,int k){ if(current == 0){ ++totalsum[sum-k]; return; } for(int i =1;i<=6;+
2014-03-17 12:07:06
556
原创 找逆序的对数&&和为n的两个数字&&和为n的连续正数序列
11#include#include#includeusing namespace std;int temp[100];int findreversenum(int *numbers,int beg,int end){ if(beg == end){ return 0; } int mid,leftnum,rightnum,num = 0; mid = (beg+end)
2014-03-16 11:37:32
411
原创 从1到n的数中1出现的个数&&寻找丑数
从1到n的数中1出现的个数,最简单的思路就是从1到n求每个数字中1的个数,这样就是速度太慢了。可以寻找规律,假设数为abcde,c在百位上,求百位上的数字的方法:如果c等于0或者大于1,1的个数只与左边有关(即ab),如果c等于1,1的个数和左边右边都有关(即de)。具体见代码:#include#include#includeusing namespace std;int
2014-03-15 14:22:55
467
原创 连续子数组的最大和
很常见的面试题目了,有两种方法:一、观察规律,因为是寻找连续最大和,需要遍历整个数组,用一个变量来记录所有连续和中最大的,用另一个变量来记录遍历过程中最大的。如果遍历过程中最大的变为0了,则说明后面的元素要重新计算最大值了。因为和之前统计的加上不会再增大。二、动态规划法。状态为f(i)表示以数组第i个位置结尾的连续最大和,状态方程为:如果f(i-1)小于等于0,则f(i)取当前位置的值,否
2014-03-14 21:33:00
365
原创 找数组中第k大的数
其实按照上一篇文章的思路,可以根据快排来计算第k大的数。但会修改数组中的数据,所以这里有新的不修改数据的思路:1、用multiset实现自动排序,大小为k,每个数与set中最大的数比较,如果小于则替换。2、可以用最大堆来实现,方法类似上面的。关键是看代码注释在下面。时间复杂度为:#include#include#includeusing namespace std;in
2014-03-14 20:41:49
591
原创 将二叉搜索树转换为双向链表(不创建新的结点)&&数组中出现超过一半的数字
转换的双向链表是从小到大顺序的,而二叉搜索树如果按照中序遍历则肯定是这个序列,所以要在中序遍历的过程中建立双向链表。而因为结点的左右指针都要在遍历中用到,所以创建一个新的遍历plast来记载已经找到的双向链表的最后一个结点,然后将其它结点与其连接。初始值为NULL。创建和遍历二叉树就不用再说明了,关键是链接的过程,详细参照代码。#include#include#includeus
2014-03-10 14:26:27
431
原创 根据树的后序判断是不是二叉搜索树&&二叉树中和为某一值的路径
根据树的后序判断是不是二叉搜索树#include#includeusing namespace std;bool IsSearchBinaryTree(int *numbers,int begin,int end){ if(numbers == NULL || begin>end) return false; if(begin == end) return true; in
2014-03-07 19:19:24
458
原创 顺时针输出矩阵
比如矩阵是:1 2 3 45 6 7 89 10 11 1213 14 15 16则输出顺序为 1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10。则思路就是一圈一圈的输出,比如上面矩阵中里面的一圈是6 7 11 10。那么在实际编程时,要分情况注意按行和列输出,因为存在内部的"一圈"只是
2014-03-06 21:38:07
662
原创 判断树B是否为树A的子树&&求出树的镜像
判断树B是否为树A的子树。思路很简单,以B的根节点为标准,查找A中节点是否有相同的。如果有相同的,再判断两个子树是否相同。如果不同,则继续查找。#include#include#includeusing namespace std;struct Binarytree{ int value; Binarytree *left; Binarytree *right;};
2014-03-06 16:01:23
522
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人