
ACM题目练习
文章平均质量分 70
NK_test
大部分人愿意做任何事来逃避真正的思考
展开
-
hdu 3037(Lucas定理,大组合数取模)
先来关于排列组合中 插板法的应用基础:所以对于这个问题,我们可以抽象成 将m个球放入n个盒子里的方法数(可以有空的盒子),其中m的范围是0~m#include#includeusing namespace std;#define lld long longlld Ext_gcd(lld a,lld b,lld &x,lld &y){ if(b==0)原创 2015-05-12 23:57:00 · 1572 阅读 · 0 评论 -
hdu 1711 KMP算法模板题
题意:给你两个串,问你第二个串是从第一个串的什么位置开始完全匹配的? kmp裸题,复杂度O(n+m)。当一个字符串以0为起始下标时,next[i]可以描述为"不为自身的最大首尾重复子串长度"。当发生失配的情况下,j的新值next[j]取决于模式串中T[0 ~ j-1]中前缀和后缀相等部分的长度, 并且next[j]恰好等于这个最大长度。防止超时,注意一些细节。。另外:尽量少用str原创 2015-07-22 23:00:04 · 2566 阅读 · 1 评论 -
poj 1330 Nearest Common Ancestors
最近公共祖先的经典问题。(1)dfs暴力标记查找(2)线段树(3)倍增算法(4)Tarian算法。这些我慢慢补充,自己也在学习这个算法。这道题数据量比较小,询问每组只有一个,所以我采用的是将其中一个数的祖先不断向上查找,并且做了vis标记。然后对于另一个进行的查找操作,当访问的节点正好是已经做了vis标记的,那么这个就是lca,输出即可。#include#incl原创 2015-05-24 19:13:08 · 882 阅读 · 0 评论 -
BestCoder #42题解(hdu 5232 & 5233 & 5234)
感觉这次的题目还是挺简单的。A : 如果两个人认识,那么就彼此各喝一杯酒,认识用1表示。另外主人肯定认识每一个人。数矩阵中的1加上人数n*2(主人的缘故)。#include#includeusing namespace std;int s[40][40];int main(){ int n; while(cin>>n) { int ans=0; ans+=n*2;原创 2015-05-24 18:47:35 · 1147 阅读 · 0 评论 -
2015百度之星初赛(1)题解(1001)
1001: 简单的贪心题。首先我们特判必赢和必输的两种状态(maxm),然后对战斗力排序,找到在0~m之间最大的战斗力作为初始值,然后,每一次将攻击力提升至 下一个彪形大汉的值,同时k--,如果一旦发现打不过,那么必输,break。注意战斗力1e12,用__int64#include#include#include#include#includeusing namespace原创 2015-05-31 11:56:32 · 3094 阅读 · 2 评论 -
hdu 1588 线段相交+并查集
判断第k个线段的集合中一共有几条线段。先用并查集将相交的线段合并记录,最后查询sum数组即可。#include#include#includeusing namespace std;struct node{ double x; double y;}s[2004];struct edge{ node a,b; int num;}E[2005];int fa[200原创 2015-05-23 00:30:43 · 930 阅读 · 0 评论 -
hdu 1237(中缀表达式转后缀并计算)
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。思路:一开始想的是中缀表达式转后缀,但是这样既要double又要存char,不原创 2015-05-11 23:41:47 · 1397 阅读 · 0 评论 -
回溯法解0-1背包问题(王晓东算法例题)
给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大?整个解的空间相当于一个二叉树,左边是0,代表不取这个物品,右边是1,代表取这个物品,然后进行dfs,回溯的时候修改。注意,这里应该有两个剪枝,我这里只写了一个。#include#include#includeusing namespace std;原创 2015-06-04 23:30:57 · 7709 阅读 · 0 评论 -
codeforces #298题解
A题有很多可行的构造方法,我是采取的对于每个数 i 和 i+n/2配对的方式。对于4特别处理,为2 4 1 3#include#includeusing namespace std;int main(){ int n; cin>>n; if(n==1) { cout<<1<<endl; cout<<1<<endl;原创 2015-05-08 12:27:39 · 916 阅读 · 0 评论 -
BestCoder Round #53(hdu 5422&5423&5424)
hdu 5422:题意:给出一个n个顶点,m条变的无向图,现在让你添加一条边,使1到n的最短路最短,并且在最短的情况下写出可以添加的边的不同数目。思路:很简单,两种情况:1.如果1到n之间原来不存在边,那么我们添加的这一条边肯定是1~n,所以最短路一定是1,方法只有一种;2.如果1和n之间原来存在边,那么我们就随意连两个顶点即可,方法是n*(n-1)/2。#include #incl原创 2015-08-30 00:19:49 · 2459 阅读 · 1 评论 -
zoj 3861 Valid Pattern Lock(以及自己对dfs的一些理解)
解法:先将每个点之间的可达性用c[][]记录,为0的话代表可以直接走到。但是如果要进行像3 1 2 这样的走法的话必须要先经过他们中间的点2,否则是不能走的。用c[i][j]记录i和j之间必须要经过的点。然后进行dfs搜索即可。经过这道题,自己对dfs的递归过程又有了更加深刻的了解。一开始的时候对dfs里面的参数有些疑虑,-->像这样dfs(s[0],0),但是这样的话,每次都要先判断c[原创 2015-05-08 12:58:47 · 984 阅读 · 0 评论 -
dijkstra最短路径及其输出(数学建模)
高中同学让我求8个菜市场和35个销售点(他们之间还会有15个路口)之间35*8=280个组合分别的最短路径及其输出。最短路水题,嘿嘿。能用自己学到的知识帮助别人解决问题真是极好的享受。具体注释可以见代码,写的蛮清楚的。#include#include#include#include#includeusing namespace std; #define INF 0x3f3f原创 2015-05-11 23:43:30 · 6126 阅读 · 0 评论 -
zoj 3332 Strange Country II
某人到了一个陌生城市,这个城市的特点就是:每两个城市之间都有飞机直接到达,不是双向的,给出城市的数量n,以及n * (n - 1) / 2 条城市 x 到 城市 y 的路,(表示x 到 y 有飞机),问你是不是可以每个城市都经过并且只经过一次可以的话,输出经过的城市的路径,否则输出Impossible。解:遍历每个点作为dfs的起点,如果能够实现遍历所有的点原创 2015-05-08 20:16:28 · 923 阅读 · 0 评论 -
概率dp入门的简单题(hdu 4405,牡丹江,codeforces)
最近学习了一下概率dp,感觉没有想象中的那么难。主要还是状态的转移方程的构建。对于”求概率正推,求期望反推“这句话有了初步的理解。期望的意思是说你现在处在一个状态,还需要几步到达最终状态,这是一个期望值,假如我现在已经在目标状态,那么期望是0,即解决了初始化的问题,否则并不知道起点的期望值。附上几道入门题:hdu 4405 http://acm.hdu.edu.cn/showpr原创 2015-05-07 23:58:16 · 1099 阅读 · 0 评论 -
hdu 1374 求三角形外接圆的半径
两种求三角形外接圆半径的方法:方法一:已知三角形的三边为a,b,c,a小于等于b小于等于c,它的外接圆半径为 R=abc/( 4S)S为三角形面积,可由海伦公式得到:S=√[p(p-a)(p-b)(p-c)]其中P是周长的一半证明:对于任意三角形,其面积S=(1/2)*absinC由正弦定理:a/sinA=b/sinB=c/sinC=2R因,c/sinC=2R故,R原创 2015-06-04 23:35:50 · 3527 阅读 · 0 评论 -
HDU 1198 Farm Irrigation (并查集优化,构图)
本题和HDU畅通工程类似,只不过畅通工程给出了数的连通关系,而此题需要自己判断连通关系,即两个水管是否可以连接到一起,也是本题的难点所在。记录状态,不断combine(),注意只需要判断左方和上方就行,这样不会重复判断,而且肯定都可以遍历到所有的状态。#include#include#include//记录水管的形状,每种水管用一个由'0'和'1'组成的长度为4的字符串代表,/原创 2015-06-02 23:22:46 · 1296 阅读 · 0 评论 -
2015百度之星资格赛题解
1001:可以看作找规律,其实是组合数学的一道题目。符合要求的对应关系是要么是自己和自己对应,要么是互相对应,即1->2则2->1。因为对于任何一个数如果他和自己本身对应,那么剩下还有n-1个数;如果他对应别的数(假定是a),那么a一定也和他对应,这样剩下还有n-2个数,并且他可以对应的数的选择有n-1种,所以,可得递推关系 f[i]=((i-1)*f[i-2]+f[i-1]);#原创 2015-05-25 23:52:38 · 1156 阅读 · 0 评论 -
最长公共子序列(仅借助数组dp本身在O(m+n)时间内构造最长公共子序列)
算法课上机作业,想复杂了。。给定2个序列X={x1,x2,…,xm}和Y={y1,y2,…,yn},找出X和Y的最长公共子序列。 改进LCS函数,不使用数组b而仅借助数组c本身在O(m+n)时间内构造最长公共子序列。原来的代码:void LCSLength(char *x ,char *y,int m,int n, int **c, int **b){ int i ,j原创 2015-05-12 23:55:00 · 1518 阅读 · 0 评论 -
湖南多校对抗赛(csu 1560)
简单的bfs搜索题,对每个初始的水滴依次扩展,当达到规定步数时跳出。这题还是有坑点的,对于每个初始的水滴,已经访问过的位置不再访问,但是对于不同的水滴,别的水滴已经访问过的,对于当前水滴来说可能还要访问,才能使扩展的范围最大。#include#include#include#include#includeusing namespace std;struct node{ i原创 2015-05-08 21:33:44 · 1227 阅读 · 0 评论 -
“赛码杯“题解(hdu 5214 ,5223)
题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=5214A:题意:给出一个区间的初始端点L,R,并且给出递推关系式,区间的个数范围(10的6次方),求是否存在三个不交叉的区间。先说算法:贪心。一边扫过去记录左端点的最大值和右端点的最大值,这样使得中间的范围尽可能大。然后去遍历是否存在这样的不交叉区间。坑点:wa了好几次。。 首先,给出的原创 2015-05-07 23:47:43 · 1328 阅读 · 0 评论 -
符号三角形的回溯算法(王晓东算法分析例题)
题目: 下面都是“-”。 下图是由14个“+”和14个“-”组成的符号三角形。2个同号下面都是“+”,2个异号下面都是“-”。 + + - + - + + + - - - - + - + + + - - + + - - + - -原创 2015-05-21 00:00:47 · 6899 阅读 · 0 评论 -
Bestcoder #54(hdu 5427&5428&5429&5430)
hdu 5427 简单的排序。取后四位作为年份,按照年份由大到小排序,输出时注意不要把中间的空格输出就ok。#include #include #include #include using namespace std;struct node{ string age; int year;}N[200];bool comp(node a,node b){原创 2015-09-06 21:26:38 · 1163 阅读 · 0 评论