摘要:
题意:给出n(n#include #include using namespace std;#define MAX_N 100005#define MAX_FACTOR 16int n, f[MAX_N];int count[MAX_N];int factor[MAX_FACTOR];int prime_fac_num[MAX_N];void input(){ for (int i = 0; i 1) factor[factor_cnt++] = a; for (int i = 1; i > j) > 0; j++) { if (... 阅读全文
摘要:
题意:给出一个字符串,要从头、尾和中间找出三个完全相等的子串,这些串覆盖的区间互相不能有重叠部分。头、尾的串即为整个字符串的前缀和后缀。问这个相同的子串的最大长度是多少。分析:利用KMP算法中的next数组。next数组有一个性质,如果next[b]指向a。a#include using namespace std;#define MAX_SONG_LEN 1000005char song[MAX_SONG_LEN];int left_link[MAX_SONG_LEN];int song_len;void input(){ scanf("%s", (song + 1)); 阅读全文
摘要:
题意:两个人轮流说数字,第一个人可以说区间[1~k]中的一个,之后每次每人都可以说一个比前一个人所说数字大一点的数字,相邻两次数字只差在区间[1~k]。谁先>=N,谁输。问最后是第一个人赢还是第二个人赢。分析:必胜策略是这样的,想方设法抢到N-1,这样下一个人必然会>=N。第一个人抢到N-1的方法,就是先说一个数字与N-1的差是k+1的整数倍。因为在这之后另一个人无论说几,第一个人只要把数字补齐到与N-1差k+1的整数倍即可。例如另一个人让数字增加a,那么第一个人则让数字增加k+1-a。这样就必然可以抢到N-1。也有一种情况是第一个采取这种策略,如果N-1本来就是k+1的倍数,那么 阅读全文
摘要:
题意:一个数列,给出这个数列中的某些位置的数,给出所有相邻的三个数字的和,数列头和尾处给出相邻两个数字的和。有若干次询问,每次问某一位置的数字的最大值。分析:设数列为a1~an。首先通过相邻三个数字的和我们可以求出a3,a6,a9……是多少。a3=sum(a1,a2,a3)-sum(a1,a2)。a6=sum(a4,a5,a6)-sum(a3,a4,a5)。后面依次类推。推到了数列的最右面,如果恰好知道了an或者a(n-1)中的一个,那么可以通过sum(an,a(n-1))减去它来求得另一个。这个题还有个性质就是,只要知道数列中连续的两位就可以通过不断向两侧延伸的方法得到整个数列。因为任意相邻 阅读全文
摘要:
题意:给出一个4×4的点阵,连接相邻点可以构成一个九宫格,每个小格边长为1。从没有边的点阵开始,两人轮流向点阵中加边,如果加入的边构成了新的边长为1的小正方形,则加边的人得分。构成几个得几分,最终完成九宫格时,谁的分高谁赢。现在给出两人前若干步的操作,问接下来两人都采取最优策略的情况下,谁赢。分析:博弈搜索,有人说要加记忆化,我没有加也过了……与赤裸裸的博弈搜索的区别在于对于最终状态,并不是谁无路可走谁输,而是谁分低谁输。注意判断分数相等的情况。在搜索中每个节点要么是必胜态,要么是必败态,可参见这里对NP问题的描述:http://www.cnblogs.com/rainydays/a 阅读全文