摘要:
通常情况下,树状数组可用来处理单点修改,区间查询。 通过前缀和的转换,可以使其处理区间修改和单点查询。考虑原数组和前缀和数组:修改原数组的某个点(i) 等价于 修改前缀和数组 的一条线段(1~i 都要修改)查询原数组的某条线段(1~i) 等价于 查询前缀和数组的一个点(i)这样,适当地处理前缀和数组... 阅读全文
摘要:
差分约束系统,题意非常明显,比较简单。1、题目中有冲突的数据需要特判。2、注意读题:每个小朋友都必须分到糖果,所以最后的答案要加n3、注意差分约束系统有两种形式:最长路和最短路(对应≥和≤);其中最长路解出来的结果是最小值,最短路解出来的结果是最大值。(都是接近常数);要根据题意选取适当的形式;View Code 1 #include <cstdio> 2 #include <cstdlib> 3 #include <queue> 4 #include <cstring> 5 #define S n+1 6 #define N 100000+10 阅读全文
摘要:
例题:HNOI2008 玩具装箱 状态转移方程 设, 则 设此时有决策a和b,其中a≤b 若决策a优于决策b,则 分离变量,移项整理 设 那么就意味着时决策a比决策b优 因为对于每个i来说,是常量,所以是判断决策优劣程度的充要标准。 那么现在考虑决策a,b,c,其中a≤b≤c 若那么有什么结论呢? 分情况讨论,因为和比较可以判定决策的优劣,所以分三种情况: 这意味着a比b优,b又比c优,... 阅读全文
摘要:
题目大意:n*m的矩形,切成面积相等的n块,要求N 块的长边与短边的比值的最大值最小。n<=10.初看这道题没有思路,虽然n<=10但是又没说只能切成整数,所以就不知道怎么捉。。二分答案又没想到怎么验证。事实上,我没有注意到面积相等这个条件。由于只能切(不能拼),所以每次切完的面积必然是n的整数倍,这样就可以搜了。※注意double r;int n=5;r=1/n;printf("lf",r);//此时输出0.000000r=(double)1/(double)n;printf("%lf",r);//此时输出0.200000View Code 阅读全文
摘要:
开始做noip的套题。做完这道题想把它记下来。题目不难,模拟即可,考察的是字符串的处理。本题真正值得注意的是全面考虑问题,这也是noip模拟题重点考察的内容。包括noip 2003 侦探推理。这两道题都是模拟,但是特判的情况很多。以本题为例,我没有考虑【两个--】的情况,【-在开头】的情况,和【字母-数字】,【数字-字母】的情况而且数组大小估计错误,蹦了一个点。第一编写完只有40分。经过思考,加上了【-在开头】的情况,和【字母-数字】,【数字-字母】三种情况,70分;最后比对数据,才意识到【两个--】的情况和超内存的问题,改后AC;另外,当初侦探推理那道题写完只有20分,几乎是对照数据一个点一 阅读全文
摘要:
【算法】动态规划 【难度】★★★☆☆本题是一道背包问题。很显然题目为多重背包。但是本题的数据量太大,朴素做法会超时。参考背包九讲的思路,拆分物品,处理成1,2,4,8,……,2n件物品。这道题做了一周= =。。。犯了很多沙茶错误。。。T_T >_<P.S.此题可以作为背包拆分物品的模板了View Code 1 #include<stdio.h> 2 #include <stdlib.h> 3 #define bigger(a,b) (a>b?a:b) 4 int f[1000000+1]; 5 int cash,n,am[100+1],v[100+1] 阅读全文
摘要:
这两种背包问题可以看成是完全背包(其实是多重背包),其状态转移方程F[i][j]=max{f[i-1][j-k*v[i]]+k*w[i]} 仍然适用对于分组背包,由于存在冲突,只能从一个组选一件,所以完全可以这样思考:把一组看做是一个物品,选取组中的第i件看成是选取i个该物品。这样就转换为完全背包求解了,只是将k*w[i]和k*v[i]分别映射为一个函数(对应关系)。对于有依赖背包,可以将同一系列的物品看做一组,将不同的取法看做组中的原件,即可转化为分组背包,进而转化为完全背包。P.S. 0/1 背包也可以看做完全背包,其中k∈[0,1];多重背包也是完全背包。所以可见,完全背包的应用和变.. 阅读全文
摘要:
【算法】DFS 【难度】★★★★☆思路:经典的N皇后问题,但是对于6 <= N <= 13的范围朴素搜索1s内无法出结果。所以要考虑加速。考虑到剪枝的优化空间有限,所以本题才用位运算+DFS。事实上,这个思路来自于Matrix67的文章,按照我自己的理解描述一下:同样是一个DFS的递归,带有三个参数row,lc,rc分别标记这一横行上受到纵列(|)、右倾对角线(\)和左倾对角线(/)上已经放过的棋子的影响有冲突的位置。标记方法是按位表示:用0表示无冲突,1表示有冲突例如,如果一个6皇后的某次的lc二进制下为100101,这表示在第1、4、6个位置受到右倾对角线上已放过棋子的限制,在 阅读全文
摘要:
【算法】贪心 【难度】★☆☆☆☆考查贪心和排序。按题意需要找所需木板的最小总长度,若不考虑木板数目的限制,理论上的最短木板就是把所有有牛的牛棚都盖住。所以贪心算法很明显了。由于木板总数有限,所以在盖住所有有牛的牛棚后,找出连续牛棚之间的空隙,将最短空隙连起来,并重复这一过程,直到木板总数达到要求。View Code 1 /* 2 ID: wsc5001 3 LANG: C 4 TASK: barn1 5 */ 6 #include <stdio.h> 7 #include <stdlib.h> 8 int b[200][4]={0},a[201]={0}; 9 void 阅读全文
摘要:
【算法】模拟 【难度】★★★☆☆关键在于题目分析。此题要求按下C次后符合要求的灯的所有情况。按题意,0<=C<=10000,如果直接枚举所有的情况并判断显然会超时。注意分析题目可知:1、任意一个按钮按下两次相当于一次都没按。利用这一点可以解决所有C>4的情况。由于只有4个按钮,所以C>4时必然至少有一个按钮被按下两次,故所有的情况可归为以下15种:1 2 3 4 12 13 14 23 24 34 123 124 134 234 一个都没按(c==0)2、按下2并按下3相当于按下1。同样的,按下1和2相当于3,按下1和3相当于2。所以以上15种情况可以归为:C==0 一 阅读全文