随笔分类 - ACM题解
摘要:题目大意:2到9每个数字对应3字母(对应关系题中已给出),给定一个长度不超过12的数字序列,则可以对应到多个字符串,现给定一个字典(含很多字符串的文件),打印数字序列对应的且在字典中出现过的字符串。分析:每个数字对应3个字母,最坏情况下有12个数字,可对应312=531441个字符串,而且题中字典中的字符串是按字典序给出的,所以可以用二分查找,所以应该可以用暴力+二分过。另一个办法就是建字典树,然后dfs时边搜遍判断,这样效率应该有所提升。我是用字典树过的。需要注意的是当字典中不存在符合要求的字符串时,要输出“NONE”View Code /*ID: lijian42LANG: C++TASK
阅读全文
摘要:DescriptionIn this problem, you are given a pair of integers A and B. You can transform any integer number A to B by adding x to A.This x is an integer number which is a prime below A.Now,your task is to find the minimum number of transformation required to transform S to another integer number T.In
阅读全文
摘要:数学模型:在数轴上画n条线段,求最长的连续线段的长度和最长的空白的长度(线段间的空白)。分析:读数据时只读入有效线段,被其他线段完全覆盖的略去,然后根据线段的起点排序,此时相邻线段要么中间有空白,要么相交,若相交则合并为一条线段,经过处理后得到cnt条互不相交的线段,此时统计结果即可。View Code /*ID: lijian42LANG: C++TASK: milk2*/#include <stdio.h>#include <stdlib.h>#define MAX(a,b) ((a)>(b)?(a):(b))#define N 5001int n;struc
阅读全文
摘要:题目大意:统计从1900年1月1号开始的n年时间内,每个月的13号落在星期一、星期二、星期三……星期日的次数。分析:从今年某个月的13号到明年那个月的13号经过的时间恰好是一年,经过的天数可能是365或366,从今年的1月13到明年的1月13经过的天数是由今年的二月份的天数决定的,也就是由今年是否是闰年决定的,2月也是一样,但从今年的3月13到明年的3月13经过的天数是由明年的二月份的天数决定的,也即由明年是否是闰年决定,4、5、6、……12月也一样。365%7=1366%7=2知道了以上2个算式,便可以从今年每月13的星期数推得明年的每月13的星期数,以后n年的都可以推出。递推的初始边界为1
阅读全文
摘要:此题是经典树形DP题,没有上司的晚会。公司所有人员之间的关系可以用一个树来表示,任何一个人(除了最大的boss外)都有且只有一个直接上司,现要开一个Party,邀请尽量多的人参加,要求任何人不得与直接上司同时参加。抽象后的数学模型:在一棵树中,最多能选取多少结点,使得任何结点之间没有直接连边。状态设计:d[i][0]表示在以i为根结点的子树中,在不选结点i的情况下最多能选取的结点数目,d[i][1]表示在以i为根结点的子树中,在选取结点i的情况下最多能选取的结点数目。状态转移:d[i][0]=(max(d[j][0],d[j][1])),j为i的儿子结点,d[i][1]=∑(d[j][0]),
阅读全文
摘要:Description有N个点,有一个商人想经过所有的点恰好一次(商人最终不一定要回到起点),求商人需要走最短路程。Input两个整数N,M表示图的点数和边数,接下去有M行,每行三个整数a ,b ,c 表示从a到b有一条无向边,长度是cN<=15 c<=10000Output输出商人需要走过的最短距离 ,如果不能到达所有的点,输出-1 。Sample Input4 6 1 2 1 1 4 2 4 3 4 2 3 3 2 4 6 1 3 5Sample Output6将已走过的点和未走过的点用二进制编码成整数,然后再DP.例如:共4个点,1和2已走过,3和4未走,此时状态编码为二进制
阅读全文
摘要:Description听说附近的超市有N种商品打折促销,每种商品的单价为 Ci,实际价值为Wi。你和你的朋友们决定去超市购物,当然你们要买的东西已经包括在这N种商品中。一行A个人就往超市走了,到了超市被促销员告知每种商 品每人限购一件,让大家都有些许遗憾。你们每个人身上都带了一定数额的钱M,每个人都想用自己的钱买到总价值最大的一些商品。现在,你想知道所有人买的商 品总的实际价值是多少?Input多组测试数据直到文件末尾。第一行输入A和N(0 < A <= 50, 0 < N <= 1000)代表人数和商品种数。第二行输入A个数,表示每个人身上带的钱Mi(0 < M
阅读全文
摘要:Description给出N个长度不超过5000的只含数字的字符串,你需要回答M次形如i j的询问,对于每次询问用一行输出一个整数表示第i个字符串和第j个字符的最长公共前缀的长度。比如两个字符串分别为201212和201112,"2"、"20"和"201"都是它们的公共前缀,但最长的公共前缀是"201",于是就应当输出3。Input输入包含多组测试数据。每组数据的第一行为一个整数N(1<=N<=1000),表示一共有N个字符串。接下来一共有N行,每行均有一个长度不超过 5000的只含数字的字符串,这N行
阅读全文
摘要:Description有三个无刻度标志的水杯,分别可装 a ,b , c升水,并且a>b , a>c , a,b,c,均为正整数。任意两个水杯之间可以相互倒水。用杯子x给y倒水的时必须一直持续到把杯子y倒满或者把杯子x倒空,而不能中途停止。倒水过程中水量不变。最初的时候只有大杯子装满水,其他两个杯子为空。问能不能量出x升水,如果可以,最少需要多少步?Input输入有多组数据。每组数据为一行,有4个正整数a,b,c,x且满足:a>b,a>c,a>x,a,b,c,x <= 1000。Output输出一个整数。如果可以量出x升水,输出需要的最少步骤,否则,输出-1
阅读全文
摘要:这题是ZOJ 1008那题。给你n*n个方块,每个方块被对角线划分为4部分,每一部分里面有一个数字,问能否将方块拼成一个边长为n的大方块,使得相邻方块的相邻数字相同。用dfs搜索,需要剪枝,同一层中相同方块只搜索一次。View Code #include <stdio.h>#include <string.h>#define N 26#define T 0#define R 1#define B 2#define L 3int x[N][4],top;int n,id[N],num[N];bool success;int Left(int k){ if(k%n==0)
阅读全文
摘要:DescriptionYou are in the world of mathematics to solve the great "Monkey Banana Problem". It states that, a monkey enters into a diamond shaped two dimensional array and can jump in any of the adjacent cellsdown from its current position (see figure). While moving from one cell to another
阅读全文
摘要:经典的线段树的题,线段染色问题。跟“Mayor's Posters”那题差不多,只不过这题有多次查询。需要注意的是给的区间[a,b],a可能会大于b。View Code #include <stdio.h>#include <string.h>#define N 100001int n,m,k,ans;int vis[31];int color[4*N];void pushdown(int cur,int x,int y){ int ls=cur<<1,rs=cur<<1|1; if(color[cur]) { color[ls]=col
阅读全文
摘要:数学模型:给定一个整数序列(最多10000000个数),初始化为0,一共有n(最大10000)个操作,其中第i个操作是将某个指定区间内的数赋值为i,求在经过n次操作后,序列中有多少个不同的非0数该题可用线段数来做,保存的关键信息为这段的值,最后的查询只有一次。需要注意的是最多有10000000个数,但n不大,所以可以用离散化处理进行优化。View Code #include <stdio.h>#include <string.h>#include <stdlib.h>#define N 10001#define INF 0x7fffffffint a[N],
阅读全文
摘要:维持一个整数序列,支持2种操作:1、增加一个整数到序列中;2、求序列的第K大的数。思路:建两个堆,一个小堆来保存前K大的数,一个大堆来保存剩余的数,这样的话,就满足小堆中最小的数也会大于等于大堆中最大的数,在插入的过程中,我们仍需维持这种性质,先将插入的数进入大堆,然后比较2个堆顶的数,若不满足上述性质则交换,直到满足为止。建大堆:priority_queue<int> qmax;建小堆:priority_queue<int ,vector<int>,greater<int> >qmin.View Code #include <stdio.
阅读全文
摘要:数学模型:维持一个01序列,支持2种操作:1、将给定区间内的数取反;2、查询给定区间内1的个数。这题就是“暑假集训每日一题0712”的简化版View Code #include <stdio.h>#define N 100001int n,m,ans;int sum[4*N],rev[4*N];void update(int cur){ int ls=cur<<1,rs=cur<<1|1; sum[cur]=sum[ls]+sum[rs];}void pushdown(int cur,int x,int y){ int mid=(x+y)>>1,
阅读全文
摘要:维持一个整数序列,支持2种操作:Q a b:查询区间[a,b]内的和;C a b x:将区间[a,b]内的每个数加上x。对于每次查询输出结果。结果可能会超32位。View Code #include <stdio.h>#define N 100001int n,m,a[N];long long ans;long long sum[4*N],inc[4*N];void update(int cur){ int ls=cur<<1,rs=cur<<1|1; sum[cur]=sum[ls]+sum[rs];}void pushdown(int cur,int x
阅读全文
摘要:维护一个只有0和1的整数序列,支持以下操作:1 x y v : 将区间[x,y]之间的所有整数都变为v(v为0或1);2 x y : 将区间[x,y]之间所有的1变为0,所有的0变为1;3 x y : 查询区间[x,y]内的1的个数。线段数练习:每段保存3个关键信息:和,修改标记,反转标记。需注意的几点:在更新某段时,之前的反转操作将无效,应将其清零,在下传修改标记时,应将左右儿子的反转标记清零。View Code #include <stdio.h>#define N 100001int n,m,ans;int a[N],sum[4*N],val[4*N],rev[4*N];vo
阅读全文
摘要:维护一个整数序列,支持2中操作:1、修改某个指定数的值;2、查询指定区间的最大值。View Code #include <stdio.h>#define MAX(a,b) ((a)>(b)?(a):(b))#define N 200001int n,m,D;int max[4*N];void init(){ int i; for(D=1;D<n+2;D<<=1); for(i=1;i<2*D;i++) max[i]=0; for(i=1;i<=n;i++) scanf("%d",&max[i+D]); for(i=D-
阅读全文
摘要:维护一个整数序列,支持3种操作:1、将指定的数加上一个值;2、将指定的数减去一个值;3、查询指定区间的和。View Code #include <stdio.h>#define N 50001int t,n,D;int sum[4*N];void init(){ int i; for(D=1;D<n+2;D<<=1); for(i=1;i<2*D;i++) sum[i]=0; for(i=1;i<=n;i++) scanf("%d",&sum[i+D]); for(i=D-1;i^1;i--) sum[i]=sum[i<
阅读全文
摘要:这题可以看成是“集训每日一题0711”的简化版,没有修改操作,只需查询最小和最大的。View Code #include <stdio.h>#define MIN(a,b) ((a)<(b)?(a):(b))#define MAX(a,b) ((a)>(b)?(a):(b))#define INF 0x7fffffff#define N 50001int n,m,D;int min[4*N],max[4*N];void init(){ int i,t; for(D=1;D<n+2;D<<=1); for(i=1;i<2*D;i++) { min[
阅读全文

浙公网安备 33010602011771号