2020.7.8比赛总结

题目链接
感受:这场比赛基本都是贪心,都是思路准确就能写出代码。同时正是因为这个我也发现自己脑子里想出来的那个思路总是不完善,想不全就开始写,总是要WA上几下,有一道纯模拟的题总是会错,赛后也是发现自己比赛中的思路是不全对的,而且有一些编程的技巧没有用上。总的来讲就是两句话:思路有偏差。程序不简洁,导致调试起来很缓慢。
不知道为什么老是只能出三个题,第四个总是会因为一点点小原因卡住。而在别人眼里出题都很“丝滑”,水到渠成,而我总是卡住。
总结以下思路把。

A题

题目大意:给你两串字符串和他们的长度,每次可以对两串字符串反转相同长度的子串(位置可以不同),问最后能否把两串字符串变成一样的。
思路:有三点是非常重要的,而我只能想到两点最简单的,最后一点没想到。
1.如果两串字符串的字符种类和每种种类的数量都相同则可能能够变成一样的,否则不行输出no
2.如果种类和每种种类的数量一样的,那么如果其中有一种字符的数量大于2,那么一定可以,因为可以把那两个一样的放到一起,每次只变换那两个一样的,整个字符串是没有影响的。
3.这点我确实想不到。固定一个字符串的后两位,这里选择s串。从s[i]开始和t[i]匹配,若不相等,则从t[i]开始向后找和s[i]相等的那个,每次s串只交换最后两个字符,t串交换相邻两个字符。可以保证最后从1到n-2两个字符串对应的字符是相等的,若最后两个字符相等则输出yes,否则no
还是怪自己想不到啊

B题

题目大意:给你一个只包含‘0’和‘1’的字符串,长度是n,每次只可以交换字符串的相邻两个字符,每交换一次视作一次操作,这样的操作你一共可以做k次,问最多执行k次操作,可以把这个字符串变换到的最小字典序的串是什么样的。
思路:首先明确两个字符串字典序的比较,从第一个字符开始比较,出现的第一个不一样的字符,大的那个字符所在的串大于另一个串。明白这个就简单了,就尽量让‘0’往前面跑,已经在前面的零就不用管了,同理,在后面的‘1’也不用管了。设立两个指针,从前扫,扫到第一个1停止为left,从后扫,扫到第一个‘0’为right。对于全0和全1的字符串直接输出。然后从前面每次找到一个‘1’,向后找到第一个‘0’若可交换次数大于等于他们两个之间的下标差,则直接交换,否则就把‘0’向前提k个位置,输出即可。
思维全面一点就好了

C题

题目大意:给你四个数字,a,b,n,s。表示有a个数字n,b个数字1,问用现有组合能否组成s。
思路:注意思维全面一点,避免WA就可以了。

D题

题目大意:有n个人,每个人有自己的能力值,最少三个人一队,每一队的多样性是这一队里最大的能力值减去最小的能力值。问这n个人为了使最后多样性的值最小,怎么分队伍最好。
思路:一道dp题。首先对能力值排个序,保存一下原始位置,所以用结构体。然后分析组队情况。最少三个人,四个人的时候也是一队,五个人的时候也是一队,六个人的时候必然要分成两队能力值才最小,这里假设六个值从小到大给出,a,b,c,d,e,f。
分成一队的话,结果是f-a,分成两队的话,答案是c-a+f-d=f-a+c-d。因为c-d<0,所以很明显第二个值更小。
那么一个队的人数只能是3,4,5三种情况,设dp[i]表示前i个人分成若干队的最小值,顺便记录一下路径。记录路径和平常dp记录路径一样。
那么dp[i]=dp[i-3]+a[i]-a[i-2]
dp[i]=dp[i-4]+a[i]-a[i-3]
dp[i]=dp[i-5]+a[i]-a[i-4]
取最小值就好了。
最后输出路径。
感觉自己在dp上又迷茫了,还是要多做题才行啊。

E题

题目大意:有一个长n的水平轴,你一开始在0,现在你要去n+1,从1到n是河,你有m块木板,每块木板长ci,你最远能跳d个单位长度。问能否到达n+1,并输出木板摆放情况。
思路:ac这道题很容易,只要心里有一个明确的方向,然后向这个方向打代码就可以了。
首先把所有木板从右到左依次放置,然后在每次跳的时候如果落点没有木板,则向后找第一个木板,把那个木板的位置拉到落点往后。
那么现在就只剩判断能否到达了。我们注意到每次最大能跳d,每次放木板都可以把木板当成一次跳板,那么一共可以跳(m+1)次,在加上所有木板的长度sum。但是,每次跳的距离并不去d,而是d-1,假如我们现在在0,我们能跳到0+d去,但是,此时0+d这个位置是没有木板的,我们需要在0+d这个位置放置木板,那么跳跃长度就变成了d-1.但是最后一次跳跃的长度可以当成d,因为落点直接就是n+1是陆地了。那么最后结果就是(d-1)*(m+1)+sum+1.判断它和n的大小关系就行了。
感觉自己的编程能力还有待提高。。

F题

题目大意:给你n个数,能够对从1到n-1位置上的每一个数执行一次操作,操作是交换i和i+1位置上的数。问最后能够形成的最小字典序序列是什么。
思路:和B题一样,都是确定最小的字典序,那么总体思路就明确了,即尽量让小的在前面。在这道题里可以确定1一定要开头,然后尽量让小的数往前放,但是有一种情况要注意,比如 a i < a i + 1 a_{i}ai<ai+1那么如果 a i a_{i} ai不能再往前放了,此时 a i + 1 a_{i+1} ai+1还能往前放,那么绝对不可以再交换了。否则字典序就会变大了。
关键点就是不能让本来在后面的大数跑到前面去,尽量让在后面的小数跑到前面去。编程实现难度不大,记录一下每个位置的操作是否执行,和从1到n记录一下每个数的位置,从小到大找就可以了。

你可能感兴趣的:(总结)