该标准程序使用了动态规划的思想。

首先,程序读入测试用例的数量T,并进行T次循环,每次循环处理一个测试用例。

对于每个测试用例,程序首先读入序列的长度n和跳跃次数k,并依次读入每个格子的权值。

接下来,程序使用一个循环计算前缀和数组b,其中b[i]表示从第一个格子到第i个格子之间的权值之和。

然后,程序初始化两个指针l和r,分别表示当前跳跃区间的左边界和右边界。同时,程序初始化一个空的vector v,用于存储跳跃区间的信息。初始时,v中只有一个元素{0,0,0},表示还没有进行跳跃。

接下来,程序使用一个循环遍历每个格子,更新l和r的值。如果当前的r小于0,说明跳跃区间的权值和为负数,此时应将l和r分别更新为当前格子的下一个格子,并将r重置为0。如果当前的r大于v中最后一个元素的权值和,说明找到了一个新的更优的跳跃区间,此时将v中最后一个元素的权值和更新为r,并将当前的l、r和r-l+1作为一个新的区间加入v中。

接下来,程序初始化两个变量sum和f,分别表示当前的得分和已进行的跳跃次数。然后,程序使用一个无限循环遍历v中的每个区间,计算在当前区间内进行k-f次跳跃后的最大得分。在每次循环中,程序先将当前的得分sum与ans进行比较,更新ans为较大的值。然后,程序计算将当前区间内的所有格子的权值之和乘以剩余跳跃次数k-f,加上sum的值,得到在当前区间内进行k-f次跳跃后的得分。如果当前区间是v中的最后一个区间,则跳出循环。否则,程序计算从当前区间到下一个区间的权值差nx,并判断如果将nx加到sum上后得到的sum值仍为非负数,则将sum更新为sum+nx,并继续下一次循环。否则,说明将nx加到sum上后得到的sum值为负数,此时需要计算将sum调整为非负数所需要的最小跳跃次数cnt。如果cnt为奇数,则将cnt加1,否则保持不变。然后,程序将f增加cnt,并将sum更新为cnt乘以当前区间的权值和加上nx。最后,程序将当前的得分sum与ans进行比较,更新ans为较大的值。

最后,程序输出得到的最大得分ans,并将ans重置为0。

接下来,我们对程序的正确性进行证明。

首先,我们证明在每个跳跃区间内进行k-f次跳跃后的最大得分等于该区间内的权值和乘以剩余跳跃次数k-f加上之前的得分。

假设当前区间的左边界为l,右边界为r,权值和为sum,剩余跳跃次数为k-f。根据题意,我们需要计算在当前区间内进行k-f次跳跃后的得分。

在每次跳跃过程中,Crying 可以向她的方向跳任意步,然后转身。因此,在当前区间内进行k-f次跳跃后,Crying可以跳到区间的任意位置,并且转身后可以继续跳到下一个格子。

假设Crying跳到了第x个格子,那么Crying的得分累加上第l个格子到第x个格子之间的所有格子的权值之和(包括第l个格子和第x个格子)。根据前缀和数组b的定义,第l个格子到第x个格子之间的所有格子的权值之和可以通过计算b[x]-b[l-1]得到。

因此,在当前区间内进行k-f次跳跃后的得分等于sum+(k-f)*(b[r]-b[l-1])。

接下来,我们证明程序使用的动态规划思想是正确的。

根据上述证明,我们可以得到在每个跳跃区间内进行k-f次跳跃后的最大得分等于该区间内的权值和乘以剩余跳跃次数k-f加上之前的得分。因此,为了得到最大的得分,我们需要在每个跳跃区间内选择权值和最大的格子进行跳跃。由于每次跳跃后转身的方向会相反,因此我们需要记录当前跳跃区间的信息,以便在跳跃过程中根据转身的方向计算得分。

程序使用一个vector v来存储跳跃区间的信息。初始时,v中只有一个元素{0,0,0},表示还没有进行跳跃。在遍历每个格子的过程中,如果找到了一个新的更优的跳跃区间,程序将当前的l、r和r-l+1作为一个新的区间加入v中。这样,v中的每个元素都表示一个跳跃区间,其中l和r分别表示区间的左边界和右边界,sum表示区间的权值和。

在计算最大得分的过程中,程序使用一个无限循环遍历v中的每个区间,并计算在当前区间内进行k-f次跳跃后的最大得分。在每次循环中,程序先将当前的得分sum与ans进行比较,更新ans为较大的值。然后,程序计算将当前区间内的所有格子的权值之和乘以剩余跳跃次数k-f,加上sum的值,得到在当前区间内进行k-f次跳跃后的得分。

在计算最大得分的过程中,程序从v中的第一个区间开始计算,直到计算到v中的最后一个区间。每次循环中,程序计算从当前区间到下一个区间的权值差nx,并判断如果将nx加到sum上后得到的sum值仍为非负数,则将sum更新为sum+nx,并继续下一次循环。否则,说明将nx加到sum上后得到的sum值为负数,此时需要计算将sum调整为非负数所需要的最小跳跃次数cnt。

如果cnt为奇数,则将cnt加1,否则保持不变。这是因为在当前区间内进行cnt次跳跃后,Crying会转身并跳到下一个区间。如果cnt为奇数,那么Crying会跳到下一个区间的左边界,此时需要再进行一次跳跃才能到达下一个区间的右边界。因此,为了保证在下一个区间内进行k-f次跳跃后的最大得分,我们需要将cnt加1。否则,如果cnt为偶数,那么Crying会跳到下一个区间的右边界,此时不需要再进行一次额外的跳跃。

然后,程序将f增加cnt,并将sum更新为cnt乘以当前区间的权值和加上nx。

最后,程序将当前的得分sum与ans进行比较,更新ans为较大的值。

综上所述,该标准程序的做法是正确的

这是题面:Crying 在梦里也希望和 Mio 贴贴但是 Mio 不理她所以她一个人在梦里玩跳房子。好奇怪游戏场地是一个一行 n 个格子的序列 a每个格子都各自有一个权值第 i 个格子的权值为 a_i注意 a_i可能非正。Crying 一开始站在 1 处并且面向右侧。然后她会进行 k 次跳跃。每次跳跃Crying 可以向她的方向跳任意步也可以不跳然后转身也就是说如果她向右跳那么下次跳跃应该向左;反

原文地址: https://www.cveoy.top/t/topic/h38o 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录