FOJ2014年3月赛部分题解. FZOJ 2152 2154 2155 2156 2159

FOJ2014年3月赛部分题解

本文代码:https://github.com/illuz/WayToACM/tree/master/ACM_CODE/FZU/14March


FZOJ 2152 文件系统

题目地址

SOLUTION CODE(代码点此)

题意: 
中文题意,其实就是用户和组的对应关系以及文件对用户和组的对应关系的处理。 
关键是几个规则: 
1、如果用户是文件所有者,则只按”u权限”判定,不考虑以下条件 
2、如果用户在文件所属组的用户列表里,则只按”g权限”判定,不考虑以下条件 
3、如果不满足以上两点,这只按”o权限”判定

分析: 
模拟题,只要记录下对应关系就像了,我想敲得复杂了,各种STL都用上了…

总结: 
前置知识还挺不错的…对Linux文件的权限有了进一步的了解…


FZOJ 2154 YesOrNo

题目地址

SOLUTION CODE(代码点此)

题意: 
就是问X串能否通过不断地切成两半调换顺序变成Y串.

分析: 
刚开始被操作次数不限吓到了,后来发现,你第一刀切下去会有一个切口,后面每切一刀会产生心的切口,但是原有的切口也被消掉了,所以,只要暴力切口,然后看看能不能变成Y串就行了。 
纯粹的暴力老是TLE,因为数据规模是150W,而暴力150W次,每次还要比较,比较的复杂的是O(N),所以总的复杂度是O(N*N),肯定不行。 
后面加了个判断第一个字符是否相等的剪枝就过了,无语…


FZOJ 2155 盟国

题目地址

SOLUTION CODE(代码点此)

题意: 
两个操作: 
“M X Y” :X和Y相连 
“S X” :X从集合中退出 
求最后的集合数。

分析: 
其实是带删除和重联的并查集。 
实现删除: 
为了解决删点后回影响到其他指向该节点的问题,可以开两倍的数组来放父亲节点,初始化时让各个节点指向后面那一半数组,这样修改节点就不会影响其他节点了。 
实现重联: 
实现删除后要解决的是删掉这个节点后要把节点的父亲指向哪里,如果都指向-1或者其他固定的一个值,那么如果两个都删过的点就不能相连了。所以可以在后面找一个还没用的位置给它就行了。 
注意一下,每次M操作总的集合数不一定都-1,每次S操作不一定都+1。


FZOJ 2156 Climb Stairs

题目地址

SOLUTION CODE(代码点此)

题意: 
强迫症患者Jason想要爬楼梯。 
1.他可以一次性爬X或Y个楼梯。 
2.他想要到达第N个楼梯。 
3.他必须通过第A和B个楼梯。 
问有几种方法能够到达N层。

分析: 
DP水题,用滚动数组递推下就行了。 
F[n] += F[n - x] + F[n - y]。 
注意G++下long long要用cout输出。


FZOJ 2159 WuYou

题目地址

SOLUTION CODE(代码点此)

题意: 
有两个正整数A和B,这两个数的位数相同且不含前缀0。A的一些位不能够确定,用‘?’代替。已知A是满足 A < B 的最大的A。求A 。

分析: 
想法题。 
其实考的是YY的能力,具体问题具体分析。 
由于A串肯定要比B串小,而且A串里面有一些’?’。所以我们可以一次性考虑到第一个’?’。

  1. 在第一个’?’前的A串和B串如果不相等,那么就不用继续找下去了,因为如果A_pre>B_pre,那么不管后面的?怎么填肯定也不能实现A
  2. 如果A_pre==B_pre,那么又要分情况考虑了。我们可以尝试在当前这个?里面填和B同位置一样的数字,(注意不能<0),然后继续找下一个?再次判断。
  3. 这时候我们发现可以用递归把每次找到第一个’?’递归出来,如果能找到就返回true,不行就返回false。这样第二步就好实现了。
  4. 如果填和B同位置一样的数字,进入递归返回的是false的话,说明只能把数字减一了,然后后面就和1步骤的第2种情况一样了。

这样一来,程序就YY出来了… 
需要注意的一点是,每一个数字不能小于0,而且不能有前缀0,而且如果在第2步失败的话,记得把填充过的?还原出来,不然后面就不知道原来哪些位置是?了。

总结: 
YY能力很重要,还是挺好玩的…


还有几题还没做出来,ORZ编程菜菜巨巨…

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值