每日总结2021.4.29

1.非常可乐 HDU - 1495 大意:给定三个整数: 可乐体积为S,另外有两个杯子体积为N,M。(S=N+M)。因为三个容器都没有刻度,所以每次操作只能倒满或倒完,问是否能将可乐平分,如果不能输出“NO”,否则输出最小操作步数。

思路:思路还是很好想的,最小步数模型。用bfs一层一层扩展,复杂的是倒可乐的状态的改变。每次可以选任意一个有可乐的容器往另外两个的任意一个倒,还要考虑容器的容量。总之,就是模拟。需要注意的是,只要三个容器中有两个是s/2,就算平分了,就return。

2.Find a way HDU - 2612 大意:给定一个n*m的迷宫,“#”代表障碍物,“.”代表能走的点,“@”代表目的地,一个迷宫中有多个目的地,:“Y”,"M"分别代表两个人,求两个人到达同一个目的地的最短距离。(注意对数组作为传入参数的理解,详细查看收藏)

思路:两个人?多源bfs ?,好像又不太一样,多源是多个源头扩展,求的是某个位置到其中任意一个的最短路,怎么小怎么来。这道题呢,如果要是把两个人看成源头,对于某个目的地来说只能确保到其中一个是最小但到另一个可能非常大,不是最优解。如果把多个目的地看成源头,只能求出每个人到其中一个目的地的最短路,但不能确保是同一个目的地,所以就很明确了,这道题并不是多源bfs。那该怎么做呢?先只看其中一个人,很容易求出到任意一个目的地的最短路径,然后把另一个人的也求出来,遍历每个目的地,找到和最小的就行了。完毕!

总结:扩展到多个人:多个人到某个同一位置的最短距离求法:先提前求出每个人的,然后遍历每个位置,找到和最小的就行了。注意和多源bfs区分开。

3.cf https://codeforces.com/contest/1474/problem/D 思维好题

大意:t组测试样例,t<=1e4,每组给定一个n(2<=n<=2e5),代表n个数,接下来一行输入n个数 1<=ai<=1e9,

现规定以下操作,每次可以选相邻的两数同时减1,当到0了,就不能再选了,但此位置的数还是被当做存在的,即如果ai=0,但不能选a[i-1]和a[i+1],问是否能将序列中的所有数变成0,当然,你可以最多使用一次超能力:交换相邻的两个数。如果可以输出“YES”,否则“NO”。

思路:想了好久还是没什么思路,然后去看了题解,妙啊,真的是思维好题。

首先先不考虑交换,我们怎么判断能否全部变成0呢。先来看操作规则:每次选择相邻的,相邻 !!! 那有特殊位置了,开头和结尾的,这两个位置相邻的只有一个数,是确定的。我们先从开头往后看,对于a[1],如果a[1]>a[2],那没办法了,a[1]变不成0了,如果a[1]<=a[2],那可以先把a[1]变为0,a[2]=a[2]-a[1],然后a[2]就变成了开头,特殊位置!!!(这种思想遇到不止一次了,找到特殊的,去掉特殊的,看其他的是不是又变成特殊的),从结尾的操作也是一样。不考虑交换的话,我们可以从头到尾利用前缀扫一遍判断是否能操作成功,但是我们可以交换一次,怎么判断呢?首先想想什么时候我们会用到交换,pre[i-1]>pre[i],后面的无法把前面的消除了,交换之后,然后扫到尾,判断能不能成功操作,太费时,我们怎么能在任意位置快速判断呢? 为了节约往后扫的时间,我们来搞个后缀,然后根据前后缀就可以很快的判断了。即当pre[i]==suf[i+1],就是能成功操作了。(具体操作:if(a[i]>pre[i-1])pre[i]=a[i]-pre[i-1];else pre[i]=inf/2,)这样就确保了在某个无法消除的点之后全部都是inf/2,用inf/2而不是inf的原因是为了让前后缀处理成不一样的数字,防止错误的判断相等。)交换之后判断下能不能相等,不能的话再往下看看。

总结:1.找到特殊的,消除特殊的,把其他的变成特殊的,这是关键点。前后缀的处理,快速的判断在某个点能否操作成功,3.细节:前缀和后缀在非法是置成不一样的值。(需要注意的是:此题如果每个样例都用memset重置pre和suf的话,最后大概用了1000ms,差点超时。但是每次根据输入的n重置n+10个,只用了80的ms,差距巨大。可能是因为此题数据决大部分是n比较小数据。通过此题给自己提个醒,memset虽然很快但不是万能的,有时候可能就因为它超时了,尤其是在多组测试样例的问题上。)

之后该打cf了,就先到这,提前先发了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值