摘要:
1 #include 2 #include 3 using namespace std; 4 5 int main(void) 6 { 7 long long int digit; 8 int n,m; 9 cin>>m;10 for(int i=0;i>n;12 digit=(long long int)(n*log10(n))+1;//n^n的位数 这里是+113 int left=pow(10.0,(n*log10(n)-digit+1));//n^n/10^(digit-1)的结果就是最左边的数啦~14 ... 阅读全文
摘要:
1 # include 2 3 int search(int a[], int n, int v) //这个好像是效率最高的 4 { 5 int left = -1, right = n, middle; 6 while(left+1 != right) 7 { 8 middle = left + (right-left) / 2; 9 if(a[middle] = n || a[right] != v)15 right = -1;16 return right;17 }18 19 int search... 阅读全文
摘要:
n!的位数=log10(1)+log10(2)+......+log10(n)取整后加一 1 # include 2 # include 3 4 using namespace std; 5 6 int main(void) 7 { 8 int n, t; 9 cin >> n;10 while(n--)11 {12 cin >> t;13 double sum = 0;14 for(int i = 1; i <= t; i++)15 {16 sum += log10... 阅读全文
摘要:
1 struct point{double x, y;}p[105]; 2 3 double xmult(point p1,point p2,point p0) 4 { 5 return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y); 6 } 7 8 double area_triangle(point p1,point p2,point p3) 9 {10 return fabs(xmult(p1,p2,p3))/2;11 }12 13 for(int i = 0; i < m; i++)14 {15 ... 阅读全文
摘要:
这是我找了好多找到素数筛优化的很不错的了 如果有大神知道还能再优化的话希望能提取宝贵意见 Orz 1 # include 2 # include 3 # include 4 # include 5 # include 6 # include 7 # include 8 # include 9 using namespace std;10 11 int a[1000010];12 13 int main(void)14 {15 int n;16 while(~scanf("%d", &n) && n)17 {18 a[0] = 0, a[1... 阅读全文
摘要:
最长公共子序列其实有很多方法可以过,因为在弄DP所以就只写了动态规划的方法:动态规划方法1、序列str1和序列str2 ·长度分别为m和n; ·创建1个二维数组L[m.n]; ·初始化L数组内容为0 ·m和n分别从0开始,m++,n++循环: - 如果str1[m] == str2[n],则L[m,n] = L[m - 1, n -1] + 1; - 如果str1[m] != str2[n],则L[m,n] = max{L[m,n - 1],L[m - 1, n]} ·最后从L[m,n]中的数字一定是最大的,且这个数字就是最长公共子序列的长度 阅读全文
摘要:
只是简单的求组合数 代码也很简单分子分母约分:(对于数据要求不是很多) 1 int c(int x, int y) 2 { 3 int i, j, sum = 1; 4 if(y > (x/2)) 5 y = x - y; 6 for(i = x, j = 1; i > x-y; i--, j++) 7 { 8 sum *= i; 9 sum /= j;10 }11 12 return sum;13 }View Code 数组模拟:(输入数据很大时不使用 会导致RE) 1 void cc() 2 ... 阅读全文
摘要:
整数划分问题是算法中的一个经典命题之一,有关这个问题的讲述在讲解到递归时基本都将涉及。所谓整数划分,是指把一个正整数n写成如下形式:n=m1+m2+...+mi; (其中mi为正整数,并且1 0),只有一种划分即{1}; (2) 当m=1时,不论n的值为多少,只有一种划分即n个1,{1,1,1,...,1}; (3) 当n=m时,根据划分中是否包含n,可以分为两种情况: (a). 划分中包含n的情况,只有一个即{n}; (b). 划分中不包含n的情况,这时划分中最大的数字也一定比n小,即n的所有(n-1)划分。 因此 f(n,n) =1 + f(n,n-1); (4) 当nm时,根据划分中是否 阅读全文
摘要:
1.用树状数组求逆序数缺点:只能对整数求逆序数 1 #include "TreeArray.h" 2 /* 3 算法: 4 由树状数组求逆序对。加入元素i即把以元素i为下标的a[i]值+1,从队尾到队首入队, 5 每次入队时逆序对数 += getsum(i - 1),即下标比它大的但是值比它小的元素个数。 6 因为树状数组不能处理下标为0的元素,每个元素进入时+1,相应的其他程序也要相应调整。 7 求出原始的序列的逆序对个数后每次把最前面的元素移到队尾,逆序对数即为 8 原逆序对数+比i大的元素个数-比i小的元素个数,因为是0..n,容易直接算出 9 */10 int Ni 阅读全文
摘要:
做到一道关于求数列逆序数的题,其中提到了树状数组,就学习了一下树状数组。如果给定一个数组,要你求里面所有数的和,一般都会想到累加。但是当那个数组很大的时候,累加就显得太耗时了,时间复杂度为O(n),并且采用累加的方法还有一个局限,那就是,当修改掉数组中的元素后,仍然要你求数组中某段元素的和,就显得麻烦了。所以我们就要用到树状数组,他的时间复杂度为O(lgn),相比之下就快得多。下面就讲一下什么是树状数组:一般讲到树状数组都会少不了下面这个图:下面来分析一下上面那个图看能得出什么规律: 据图可知:c1=a1,c2=a1+a2,c3=a3,c4=a1+a2+a3+a4,c5=a5,c6=a5+a6 阅读全文