http://www.codeforces.com/contest/23
下面B,C都来自iSea大神的题解;
A题
【题意】
给定一个串,求其最长重复子串长度,
【分析】
考虑到长度为100,可以暴力,我考虑到在本机可以贴模板,用后缀数组写的,取height数组的最大值输出即可;
【暴力的好的代码】
【后缀数组代码】
B题
【题意】
问n个人参加聚会,先把没有朋友的人驱逐,然后把只有一个朋友的人驱逐,然后把只有两个朋友的人驱逐……最后把有n-1个朋友的人驱逐,问最后有多少人留在了这次聚会中;
换成图论里的话说就是一个无向图中,去掉度为0的点,然后去掉度为1的点……;
【分析】
答案是n-2,分配方法是n个点取完全图,然后任意选两个相连的点,去掉,它们的度为n-1,那么我们接下来要去的点的度数为n,而剩下的点的度皆是n-3,可以留下来了;
【代码】
C题
【题意】
给定n,然后是n+n-1组数,每组数是一个x,y,要求选出n组数,使得n组数的x之和大于总的x之和的一半,y之和大于总的y之和的一半;
【分析】
从iSea大神那里学到的方法,好牛!对x从小到大排序,然后对于每两组数取y更大的那组;
原理嘛,不清楚,但却是是这样,自己可以写下例如n=5,排序后:
x1 y1
x2 y2 (1)
x3 y3
x4 y4 (2)
x5 y5
x6 y6 (3)
x7 y7
x8 y8 (4)
x9 y9
首先我们选y更大的那组,对y是保证满足条件,下面分析x,从(2)无论选哪个x,一定大于(1)中的两个x,从(3)中选的x一定大于(2)中的两个x,……最后是x9一定大于(4)中的x,这样选我们保证了未选的四个数,都有比之大的数,也就是选出的x的和一定大于总和的一半,这个思想十分值得学习,ORZ!
【代码】