FOJ 2014.3 有奖月赛

                                                FOJ 2014.3 



由于跑A区去面试的原因,这次比赛没参加,回来时已经四点多了,过了H题,然后D题交了一发,没考虑一个盟国只有一个国家的情况,wa了一次,之后就结束比赛了…具体说下每道题吧。

 

A. 文件系统 

 

简单模拟题。 把题目意思理清楚就比较简单了。每个组给一个编号,并记录它的成员,然后对每个文件进行判断就可以了。(徐伟拿了一血!!)

 

B. A simple geometric problems 

 

题目意思是给n个点,求最多能选多少个点组成凸多边形。这题一开始没想到思路,后来在博兄的指点下才明白了……明白之后就觉得比较简单了,果断好久没写计算几何了,反应比较迟钝了。

首先对n个点组成的n*(n-1)条线段进行极角排序,从小到大。因为我们逆时针来看,后一条线段的极角一定要大于前一条的。 然后枚举第i个点为起点时,遍历排序好后的线段数组,不断更新其他点的状态,即到这点之前最多有多少个点。 时间复杂度 o(n^3)

 

C. YesOrNo 

 

首先得反应出来其实两个等价的串,如果将它们看成一个环的话,它们是相等的。怎么看出这点来呢,可以在纸上画一画找规律。其实如果我们将一个串的首尾连起来看,X操作其实只是将首尾位置变换到了X操作的点的位置,还是原来那个环,丝毫没变。明白了这点后就好办了。

先将两个A串连接起来,只要B串是其子串即可。这里采用KMP判断。貌似题目数据弱了,直接暴力O(n^2) 判断也是可以0ms AC的。

 

D. 盟国 

 

题目涉及两个操作,一个是两个国家结盟,另一个是某个国家退盟,很容易反应出是并查集。但是直接搞的话,退盟操作就有些麻烦了。

可以考虑给每个国家一个编号,退盟之后的国家再给一个新的编号,即放到末尾去,那它之前那个编号就不用管了,因为它已经没有任何影响了,这样我们就对那些编号进行并查集就可以了。需要注意的一个地方就是:有可能一个盟国只有一个国家,这个时候退盟不会增加盟国数量,注意这点这题就没问题了。

 

E. Climb Stairs 

 

 

简单dp; dp[i]表示爬i层楼有dp[i]种方式;

dp[i] = dp[i-a] + dp[i-b];  dp[0] = 1;

所以答案就是 dp[a]*dp[b-a]*[n-b] (a<b) (注意要用64位整数)

 

F. ProgramCaicai's Trees 

 

树形dp ,比较简单

dp[i][0] 表示第i个点才用0方式时以它为根的子树的最小的代价

dp[i][1] 表示第i个点才用1方式时以它为根的子树的最小的代价

 

dp[i][0] = c[i][0] + Σ min(dp[j][0]+ C00 , dp[j][1]+ C01)

dp[i][1] = c[i][1] + Σ min(dp[j][0]+ C10 , dp[j][1]+ C11)

其中j 为i的子节点

答案就是 min(dp[1][0],dp[1][1]);

 

G. 数字密码 

 

这题比较蛋疼,一开始大意理解错了,以为是连续字串,直接就想到AC自动机DP了,代码都敲完了,发现错了,sad……

这里是子序列,要注意。 一个直接的想法就是一个n维dp,匹配到每个串的第多少位时所需的最少的位数,然后转移自然即使枚举下一位取哪个字符串的下一位了。 不过n维dp直接搞在C++里面应该不好弄。我想的办法是将这个状态Hash成一个整数,因为最多7个串,所以可以将它采用7进制方式来hash,

然后就可以直接dp了。 实现的时候还是要小心点,能优化的地方有优化一下,不然会超时。

 

H. WuYou 

 

直接dfs就好了,参数记录这一位是否是第一位,以及A 是否已经小于B 了;

 

当A 已经小于 B 了,那么碰到问号,就直接取 9 就行了

如果还没:

如果这一位不是问号,并且在这一位上已经大于B了,那么直接返回

不然这一位就直接是A 在这一位的值了

 

如果是问号: 那么想取与B相等的,然后考虑比B小1的情况

 

细节认真想想就OK了 !

 

第一次写题解,写得比较烂,如果大家要代码可以QQ问我要,有更好的解法可以QQ跟我交流。

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值