Codeforces Beta Round #23

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!

 

 

【代码】

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值