![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
ACM解题报告
文章平均质量分 57
windmissing
喜欢编程,喜欢思考,方向明确
展开
-
HDU1848 Fibonacci again and again 博弈
/*HDU1847博弈SG函数3.可选步数为一系列不连续的数,用GetSG(计算)最终结果是所有SG值异或的结果*/#include "SG.h"#includeusing namespace std;int Array[MAX];int main(){ int n, i, m, p, ans; Array[1] = 1; for(i = 2; ; i++) { Ar原创 2012-01-09 14:39:06 · 2114 阅读 · 3 评论 -
HDU2888二维RMQ
HDU2888二维RMQdp[row][col][i][j] 表示[row,row+2^i-1]x[col,col+2^j-1] 二维区间内的最小值这是RMQ-ST算法的核心: 倍增思想== min( [row,row+ 2^(i-1)-1]x[col,col+2^j-1], [row+2^(i-1),row+2^i-1]x[col,col+2^j-1] )= min(dp[row原创 2011-12-28 15:56:36 · 2557 阅读 · 0 评论 -
HDU3307A^B = C mod D,已知A,C,D,求解B
ai = x* ai-1 + y递推容易得到x^n -1 = m* a0/ta0' = a0 / gcd(a0,t)即 : x^n = 1 mod (a0')在gcd (x,a0') != 1 时候无解化简下来就是一个A^B = C mod D的形式,已知A,C,D,求解B。其实很显然这是一个离散对数问题,这题比较特殊的是化简之后C = 1,也很容易的想到欧拉定理a ^原创 2011-12-28 15:58:56 · 1463 阅读 · 0 评论 -
HDU3518后缀数组
题目描述:找出一个字符串中至少重复出现两次的字串的个数(重复出现时不能重叠)。解题报告:后缀数组即可解之。枚举字串长度h对于每一次的h,利用height数组,找出连续的height大于等于h的里面最左端和最右端得为之l和r。如果l + h - 1 O(n^2)复杂度。#include#includeusing namespace std;#define N原创 2011-12-28 15:59:59 · 3148 阅读 · 1 评论 -
HDU3579中国剩余定理(不互质的情况)
hdu 3579 Hello Kiki 中国剩余定理(不互质的情况)对互质的情况,处理起来比较方便,可以直接套模板本题给出不互质的模线性方程组,求出满足方程的最小正整数解方案:对于不互质的模线性方程组,可以进行方程组合并,求出合并后的方程的解,这样就可以很快地推出方程的最终解。两个方程合并的一种方法:x = c1 (mod b1)x = c2(mod b2) 此时b1,原创 2011-12-28 16:01:12 · 6922 阅读 · 1 评论 -
HDU3732多重背包
#include #include using namespace std;int word[11][11],f[10001],bag,n;//bag表示背包的总容量 void ZeroOnePack(int cost,int weight);//01背包void CompletePack(int cost,int weight);//完全背包void MultiplePack(i原创 2011-12-29 18:58:40 · 908 阅读 · 0 评论 -
hdu1181floyd传递包
//1181floyd传递包#include using namespace std;/***********************************************/bool graph[26][26];void floyd(){ int i,j,k; for(k=0;k<26;k++) { for(i=0;i<26;i++) { for(j=0;原创 2011-12-29 19:00:36 · 1100 阅读 · 0 评论 -
hdu1068二分匹配
#include #include using namespace std;#define SUCCESS 1#define FAIL -1vector > relation;int mark[500],flag[500];int allocatefor(int pos){ int newpos,i; if(flag[pos]==0) return FAIL;原创 2011-12-29 19:01:35 · 921 阅读 · 0 评论 -
1133catalan数二维变种
解题思路: 这个题目直接求合理的排序比较烦琐,采用模拟的方法也显然不行。可以先考虑可以实现的概率,再用实际的总次数去乘。 先把所有的n个拿50的人排好,接下来再把拿100的人插入队列。求可行的概率。 n个拿50的人有n+1个空位,除了第一个以外,其他的位置都可以,所以概率是n/n+1,在以上的基础下,第2个的的概率是n-1/n(由于是求概率,所以可以把所有的拿50或1原创 2011-12-29 19:02:52 · 896 阅读 · 0 评论 -
hdu1160最长递增子序列
//1160#include #include using namespace std;struct mouse{ int id; int weight; int speed; int pos; int pre;}s[10005];bool cmp(mouse a,mouse b){ return(a.weight<b.weight||(a.weight==b.wei原创 2011-12-29 19:03:15 · 1340 阅读 · 0 评论 -
HDU2433 Travel BFS求最短路径树+优化
/*1750ms边长为1,所以用BFS求最短路对于每一个点,做一次BFS,求出以这个点为出发点时的最短路径树的长度和它包含的边记录长度是用于求值,记录边是用于优化。因为只有处于最短路径树上的边的改动才会影响到结果如果要去的边的不在最短路径树上,不影响结果,如果在,则重新计算优化后还是超时,网上的解题报告都说用short,还是跑了1750ms,可能这题用vector来存储不太合适*/原创 2012-01-05 14:28:09 · 1928 阅读 · 0 评论 -
HDU2833 WuKong Floyd
/*Floyd的应用用Floyd求出任意两点间的最短路径两个定理:1.所求的路径一定是一断连续的路径2.如果路径(x,y)是a->b的最短路径中的一段,则min(a,b) = min(a,x) + min(x,y) + min(y,b)最后只需找到同时在两条最短路径上,且距离最长的那一段*/#include using namespace std;const int inf=原创 2011-12-31 14:57:22 · 1178 阅读 · 1 评论 -
HDU3483 A Very Simple Problem 数论+矩阵的应用
/*看着别人的解题报告写的,推导过程还是不太懂求sum(x^k*k^x) k=1~N x^(k+1)*(k+1)^x=x^k*x*(k+1)^x 然后用二项式定理展开(k+1)^x即可 例如当x=4时 | 1x 0 0 0 0 0 | |x^k*k^0| |x^(k+1)*(k+1)^0| | 1x 1x 0 0 0 0 | |x^k*k^1| |x^(k+1)*原创 2012-01-02 09:55:25 · 1441 阅读 · 0 评论 -
HDU3350 #define is unsafe 栈的应用
//数据结构-栈的应用#include#include#includeusing namespace std;struct node{ int value;//值 int add;//+的次数};//用容器实现栈的FILOvector ans;//数值栈vector sig;//符号栈int main(){ int t, i; string str; node原创 2011-12-31 14:00:52 · 1472 阅读 · 0 评论 -
HDU2874并查集+(LCA-RMQ)
#include #include using namespace std;#define MAX 10010int n,m,q;int tol;//边的个数int cnt;//点的个数/*****************并查集,用于把树木合成树**********************/int root = 0;//添加的虚结点int father[MAX];void原创 2011-12-28 15:54:59 · 1696 阅读 · 0 评论 -
HDU2824欧拉公式之打表算法
HDU 2824 The Euler function欧拉φ函数:φ(n)是所有小于n的正整数里,和n互素的整数的个数。n是一个正整数。欧拉证明了下面这个式子:如果n的标准素因子分解式是p1^a1*p2^a2*……*pm^am,其中众pj(j=1,2,……,m)都是素数,而且两两不等。则有φ(n)=n(1-1/p1)(1-1/p2)……(1-1/pm)如果n为奇素数,φ(n)=原创 2011-12-28 15:53:44 · 1504 阅读 · 0 评论 -
HDU3033分组背包之每组至少选一
分组背包之每组至少选一动规方程:for i:=1 to n do //循环组数for k:=1 to t do //循环每组内的物品for j:=v downto 0 do //循环体积f[i][v]=max{f[i-1][v],f[k-1][v-c[k]]+w[k]| #include using namespace std;struct node{ int原创 2011-12-28 15:57:50 · 1282 阅读 · 2 评论 -
HDU1829 A Bug's Life 并查集
并查集模板:http://blog.csdn.net/mishifangxiangdefeng/article/details/7165351/*HDU1829A Bug's Life 并查集的应用这题不是判断是否在同一集合,而是判断是否在不同的集合*/#include #include "UFS.h"using namespace std;int oppo[MAXN];//记录系原创 2012-01-18 15:49:30 · 1744 阅读 · 2 评论 -
HDU1281-棋盘游戏-二分匹配与增广链
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1281 题目描述:在一个N*M大小的棋盘中,有K个空位置,(1)在这些空位置上最多能放多少的“车”(一行或一列最多一个)。(2)空位置中,有的位置若不放“车”,就无法保证放尽量多的“车”,这样的格子被称做重要点,求重要点的个数 思考过程:这题可以看成行与列的二分匹配问题,原创 2011-12-28 15:43:32 · 3518 阅读 · 0 评论 -
HDU1166树状数组
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1166 题目分析将一组数组s[N]输入Query a b,输出SUM(sa + …… + sb)输入Add a b,s[a] = s[a] + b输入Sub a b,s[a] = s[a] - b数组动态求和,明显的树状数组,调用树状数组模版:树状数组 代码:#原创 2011-12-28 15:40:07 · 1685 阅读 · 0 评论 -
HDU1053Entropy哈夫曼求总值+优先队列
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1053 题目解释:输入一个字符串(只包含26个大写字母和‘_'),每个字母8位,这个字符串为多少位?若采用哈夫曼编码,字符串多少位,压缩率为多少(1位小数)? 常规方法:用优先队列使用哈夫曼树,计算每个字符的哈夫曼编码,那么字符串的总位数=SUM(每个字符编码的长度*字符出现原创 2011-12-28 15:37:18 · 2034 阅读 · 0 评论 -
hdu1043八数码问题解题报告
代码:HDU-1043-八数码-代码[quote]Q1:每一个状态及每一次操作的表示方法? 有许多表示方法,比如一个3*3的八数码盘可以压缩成一个int值表示,但不适用于15 puzzle或大于8 的puzzle问题。如果对空间要求很高,应该还可以再压缩。本文采用一个int表示的方法。 表示方法如下:由于int的表示范围大于1e9,所以我们取一个int的低9原创 2011-12-29 19:01:08 · 2538 阅读 · 0 评论 -
HDU-1043-八数码-代码
解题分析过程见hdu1043八数码问题解题报告 //1043双向搜索-八数码#include #include #include using namespace std;char input[100];int state[10],s_num,e10[10],fac_n[10];char hash_T[400000],step[10000],hash_T2[4原创 2012-07-09 19:30:21 · 2039 阅读 · 0 评论 -
HDU1394用树状数组求逆序数
题意:一个由0..n-1组成的序列,每次可以把队首的元素移到队尾,求形成的n个序列最小逆序对数目算法:由树状数组求逆序对。加入元素i即把以元素i为下标的a[i]值+1,从队尾到队首入队,每次入队时逆序对数 += getsum(i - 1),即下标比它大的但是值比它小的元素个数。因为树状数组不能处理下标为0的元素,每个元素进入时+1,相应的其他程序也要相应调整。求出原始的序列的逆原创 2011-12-28 15:45:54 · 1623 阅读 · 0 评论 -
HDU1285基于有向图邻接表的优先队列的拓扑排序
#include #include using namespace std;//有向图的邻接表typedef struct v{ int vex;//终点的序号 v *next;//与这条有向边具有相同起点的其它有向边}V;//边结点typedef struct h{ int indegree;//入度 v *next;//指向((从该节点出发的有向边的)边结点所组成的单原创 2011-12-28 15:44:43 · 1661 阅读 · 0 评论 -
HDU1394用线段树求逆序数
题意:一个由0..n-1组成的序列,每次可以把队首的元素移到队尾, 求形成的n个序列最小逆序对数目算法:将元素依次插入线段树,每次增加的逆序对数为比它大的已经插入的 数的个数,可以用线段树维护,由于元素值为0..n,每次移动可求出增减 逆序对的数量更新。#include #define MAXN 1原创 2011-12-28 15:46:58 · 3326 阅读 · 0 评论 -
HDU1671用指针实现的字典树
用指针传递字典树,时空效率更高用字符串代替字符数组,更方便#include #include #include using namespace std;string str[10005];struct dictree{ struct dictree *child[10]; int n; dictree(){ memset(child,0,sizeof(child));原创 2011-12-28 15:48:31 · 959 阅读 · 0 评论 -
HDOJ 2438 三分查找
double min = 0, max = Pi/2,mid, midmid; while(max-min > ex) { mid = (min + max) / 2; midmid = (mid + max) / 2; if(calc(mid)>=calc(midmid)) max=midmid; else min=mid; } if(ca原创 2011-12-28 15:50:45 · 994 阅读 · 0 评论 -
HDU2544用矩阵实现的Dijkstra
#include using namespace std;int road[105][105],dis[105],n;bool In[105];int Dijkstra(int start, int end);int main(){ int m,a,b,c; while(cin>>n>>m && (n||m)) { memset(road, 0, sizeof(road));原创 2011-12-28 15:51:26 · 917 阅读 · 0 评论 -
HDU1254 推箱子 BFS+优先队列
/*箱子和人共同组成一个状态,用node来记录状态使用优先队列,是因为只有箱子移动,记数才+1,并不是每次都+1,从队列中选择记数最小的,进行下一步搜索只使用优先队列不能保证结果是最小。因为两个记数相同的状态,下一步的记数不一定相同使用flag避免重复计算*/#include #include using namespace std;struct node{ int c原创 2011-12-31 13:41:23 · 1310 阅读 · 0 评论 -
HDU3524 Perfect Squares 数论
/*还是暴力打表,然后规律递推公式:a[n]=4*a[n-1]+5(n为奇数)a[n]=4*a[n-2]+5(n为偶数)结果:ans=2*4^n-5*(4^n-1)/3(n为奇数)ans=2*4^n-4*(4^n-1)/3(n为偶数)这里由于涉及到除法取余,所以还要把3的逆元求出来*/#include #include #define mod 10007 //非原创 2011-12-31 13:03:33 · 1299 阅读 · 0 评论 -
HDU3635 Dragon Balls 并查集
//很祼的并查集#include "UnionFindSet.h"#include using namespace std;int main() { UFS ufs; int t,Case, n,q,a,b; char ch; scanf("%d", &t); for(Case = 1; Case <= t; Case++) { printf("Case原创 2011-12-29 18:57:20 · 891 阅读 · 0 评论 -
HDU2509 Be the Winner 博弈
/*和1907几乎完全一样,不解释*/#include using namespace std; int value[101]; int main () { int n,sum,temp, i, cnt; while (cin>>n) { sum = 0;cnt = 0; for(i = 0; i < n; i++) { ci原创 2012-01-10 10:30:36 · 1572 阅读 · 0 评论 -
HDU2188 悼念512汶川大地震遇难同胞——选拔志愿者 博弈
/*1.可选步数为1-m的连续整数,直接取模即可,SG(x) = x % (m+1); */#include using namespace std;int main(){ int t,i,m,n; cin>>t; while(t--) { cin>>n>>m; if(n%(m+1)==0)cout<<"Rabbit"<<en原创 2012-01-10 10:04:49 · 1852 阅读 · 0 评论 -
HDU2149 Public Sale 博弈
/*1.可选步数为1-m的连续整数,直接取模即可,SG(x) = x % (m+1);*/#include using namespace std;int main(){ int m,n,i; while(cin>>m>>n) { int x=m%(n+1); if(m<=n) { for(i=原创 2012-01-10 09:54:39 · 1432 阅读 · 0 评论 -
HDU1850 Being a Good Boy in Spring Festival 博弈
/*2.可选步数为任意步,SG(x) = x; 本题中每一堆都可以选任意个,所以每一堆的SG值都是所剩余的个数。最后结果是所有堆的SG值异或的结果。令ans = 所有堆的SG值异或的结果如果ans == 0,则是必败点。如果ans != 0,使取后结果为0的策略是必胜策略具体怎么取呢?每一堆的数值与ans相异或,所得的结果就是这一堆可以取的数量。但是,如要这一堆数量没有这么多,就不原创 2012-01-10 09:41:27 · 2034 阅读 · 0 评论 -
HDU1846 Brave Game 博弈
/*HDU1846博弈每走一步可以取走1…m个石子,则SG(x) = x % (m+1)SG(x) != 0 为必胜点*/#includeusing namespace std;int main(){ int c,m,n,i,j; cin>>c; while(c--) { cin>>m>>n; int ans = m % (n+1); if(ans || m原创 2012-01-09 13:11:23 · 1004 阅读 · 0 评论 -
HDU1847 Good Luck in CET-4 Everybody! 博弈
/*HDU1847博弈SG函数3.可选步数为一系列不连续的数,用GetSG(计算)*/#include "SG.h"#includeusing namespace std;int Array[MAX];int main(){ int n,i,j = 1; for(i=1,j=1; j <= MAX;i++,j=j*2) Array[i] = j; Array[0] = i原创 2012-01-09 14:16:01 · 1355 阅读 · 0 评论 -
hdu1114 Piggy-Bank 完全背包
/*设d[k]是重量为k时所对应的最小价值,重量不可能凑成k时,置其为-1,表示无穷大状态转移方程:dp[k] = 0…………k = 0;dp[k] = min(value[j] + dp[k - weight[j]])…………k >= weight[j];其中,1=本题求的是最小,模板需要做一些细微的改动/*完全背包有N种物品和一个容量为V的背包,每种物品都有无限件原创 2011-12-29 19:02:00 · 957 阅读 · 0 评论 -
HDU2054 A == B ? 模拟题
//2054 模拟题#include using namespace std;int main(){ char p(char x[100000]); int j,i; char a[100000],b[100000]; while(cin>>a>>b) { //处理类似于3.000这样的情况 for(i=0;i<strlen(a)原创 2012-01-07 20:30:50 · 1170 阅读 · 0 评论