随笔分类 -  ACM

摘要:Make Palindrome大意:求一个字符串在通过在任意位置增加一个字符使得变为一个回文串的最小操作数及打印出该回文串。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 using namespace std;10 11 int dp[1010][1010];12 13 int Max(int x, int y)14 {15 if(x >= y)16 return x;17 return y;18 }19 20 ... 阅读全文
posted @ 2013-10-29 19:18 GLSilence 阅读(214) 评论(0) 推荐(0)
摘要:Bad Hair Day开个标记数组记录,记录右边第一个比它大的位置。#include #include #define N 80001long long p[N],left[N],sum;int main(){ int n,i,j; scanf("%d",&n); for(i = 1; i = 1; i--) { j = i+1; while(j #include using namespace std;const int N = 80005;int stack[N];int top, n;int main(){ int num; ... 阅读全文
posted @ 2013-10-24 21:35 GLSilence 阅读(255) 评论(0) 推荐(0)
摘要:因式分解# include # include # include # include # include # include # include # include using namespace std;int a[100000010];int b[100000010];void run(){ int t, num, q, n; scanf("%d", &n); t = sqrt(n); num = 0; for(int i = 2; i = 1; i--) { num++; a[num] = n/a[i]; } ... 阅读全文
posted @ 2013-10-22 20:54 GLSilence 阅读(240) 评论(0) 推荐(0)
摘要:struct node{ char data[100];} s[100010];bool cmp(const node &x, const node &y){ if(strcmp(x.data, y.data) < 0) return true; return false;}sort(s, s+n, cmp); 阅读全文
posted @ 2013-10-22 20:01 GLSilence 阅读(336) 评论(0) 推荐(0)
摘要:HDU1071应该是求定积分的 但是还没研究很透怎么用定积分实现 就找了一个公式s = -(y2-y1)/pow(x2-x1, 2)*pow(x3-x2, 3)/6以下是Discuss中的详细分析:设直线方程:y=kx+t…………………………………………………………(1)抛物线方程:y=ax^2+bx+c……………………………………………………(2)已知抛物线顶点p1(x1,y1),两线交点p2(x2,y2)和p3(x3,y3)斜率k=(y3-y2)/(x3-x2)……………………………………………………(3)把p3点代入(1)式结合(3)式可得:t=y3-(k*x3)又因为p1是抛物线的顶点 阅读全文
posted @ 2013-09-27 14:45 GLSilence 阅读(1535) 评论(0) 推荐(0)
摘要:HDU1222思路:思路:m和n如果有公约数,则安全洞存在,无公约数或公约数为1,则无 1 # include 2 typedef long long LL; 3 4 LL gcd(LL m, LL n) 5 { 6 if(m<n) 7 { 8 int t = m; 9 m = n;10 n = t;11 }12 while (n != 0)13 {14 int r = m % n;15 m = n;16 n = r;17 }18 ret... 阅读全文
posted @ 2013-09-25 21:30 GLSilence 阅读(357) 评论(0) 推荐(0)
摘要:在数论,对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。φ函数的值 通式:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn),其中p1, p2……pn为x的所有质因数(看准是质因数 刚开始以为是因数 怎么算都不对),x是不为0的整数。 1 # include 2 # include //0是朋友 1不是朋友 3 # include 4 5 int a[33000], b[33000]; 6 7 int main(void) 8 { 9 int n, m;10 scanf("%d", &m);11 ... 阅读全文
posted @ 2013-09-24 15:31 GLSilence 阅读(479) 评论(0) 推荐(0)
摘要:一个三角形的时候,再加一个三角形,每一条变会与第一个三角形的两条边相交,这样增加2个小三角形,即两个面。f(2)=3*2+f(1),再加一个三角形,每一条边会与前两个三角形的四条边相交,形成四个小三角形,f(3)=3*4+f(2),依次类推,f(n)=f(n-1)+6*(n-1),化简即f(n)=3*2*(n-1)+f(n-1)。 1 # include 2 # include 3 using namespace std; 4 5 void run1() 6 { 7 int n, m; 8 scanf("%d", &n); 9 while(n--)10 {... 阅读全文
posted @ 2013-09-23 19:26 GLSilence 阅读(669) 评论(0) 推荐(0)
摘要:(1) n条直线最多分平面问题题目大致如:n条直线,最多可以把平面分为多少个区域。析:可能你以前就见过这题目,这充其量是一道初中的思考题。但一个类型的题目还是从简单的入手,才容易发现规律。当有n-1条直线时,平面最多被分成了f(n-1)个区域。则第n条直线要是切成的区域数最多,就必须与每条直线相交且不能有同一交点。 这样就会得到n-1个交点。这些交点将第n条直线分为2条射线和n-2条线断。而每条射线和线断将以有的区域一分为二。这样就多出了2+(n-2)个区域。故:f(n)=f(n-1)+n=f(n-2)+(n-1)+n……=f(1)+1+2+……+n=n(n+1)/2+1 ... 阅读全文
posted @ 2013-09-13 17:44 GLSilence 阅读(486) 评论(0) 推荐(0)
摘要: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... 阅读全文
posted @ 2013-09-12 10:35 GLSilence 阅读(269) 评论(0) 推荐(0)
摘要: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... 阅读全文
posted @ 2013-09-10 15:12 GLSilence 阅读(352) 评论(0) 推荐(0)
摘要: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 ... 阅读全文
posted @ 2013-09-08 14:13 GLSilence 阅读(610) 评论(0) 推荐(0)
摘要:这是我找了好多找到素数筛优化的很不错的了 如果有大神知道还能再优化的话希望能提取宝贵意见 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... 阅读全文
posted @ 2013-08-23 16:19 GLSilence 阅读(261) 评论(3) 推荐(0)
摘要:最长公共子序列其实有很多方法可以过,因为在弄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]中的数字一定是最大的,且这个数字就是最长公共子序列的长度 阅读全文
posted @ 2013-08-21 16:27 GLSilence 阅读(459) 评论(0) 推荐(0)
摘要:只是简单的求组合数 代码也很简单分子分母约分:(对于数据要求不是很多) 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 ... 阅读全文
posted @ 2013-08-20 10:07 GLSilence 阅读(232) 评论(0) 推荐(0)
摘要:整数划分问题是算法中的一个经典命题之一,有关这个问题的讲述在讲解到递归时基本都将涉及。所谓整数划分,是指把一个正整数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时,根据划分中是否 阅读全文
posted @ 2013-08-16 15:01 GLSilence 阅读(2877) 评论(0) 推荐(4)
摘要: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 阅读全文
posted @ 2013-08-14 15:53 GLSilence 阅读(389) 评论(0) 推荐(0)
摘要:做到一道关于求数列逆序数的题,其中提到了树状数组,就学习了一下树状数组。如果给定一个数组,要你求里面所有数的和,一般都会想到累加。但是当那个数组很大的时候,累加就显得太耗时了,时间复杂度为O(n),并且采用累加的方法还有一个局限,那就是,当修改掉数组中的元素后,仍然要你求数组中某段元素的和,就显得麻烦了。所以我们就要用到树状数组,他的时间复杂度为O(lgn),相比之下就快得多。下面就讲一下什么是树状数组:一般讲到树状数组都会少不了下面这个图:下面来分析一下上面那个图看能得出什么规律: 据图可知:c1=a1,c2=a1+a2,c3=a3,c4=a1+a2+a3+a4,c5=a5,c6=a5+a6 阅读全文
posted @ 2013-08-14 15:02 GLSilence 阅读(212) 评论(0) 推荐(0)
摘要:BFS 判断可达性 邻接vector存储 1 # include 2 # include 3 # include 4 # include 5 # include 6 # define N 1010 7 using namespace std; 8 9 bool vis[N];10 vectorG[N];11 12 void add(int u, int v)13 {14 G[u].push_back(v);15 }16 17 bool BFS(int s)18 {19 queueq;20 q.push(s);21 vis[s] = true;22 ... 阅读全文
posted @ 2013-08-09 13:25 GLSilence 阅读(330) 评论(0) 推荐(0)
摘要:基于邻接矩阵的BFS: 1 # include 2 # include 3 # include 4 # include 5 # include 6 # define N 1010 7 using namespace std; 8 9 int map[N][N];10 int vis[N], p[N];11 queueq;12 int t = 0, n;13 14 void BFS(int s)15 {16 vis[s] = 1;17 for(int i = 0; i > o;38 while(o--)39 {40... 阅读全文
posted @ 2013-08-09 11:03 GLSilence 阅读(230) 评论(0) 推荐(0)