TYOI Noip模拟赛1 [T3]开灯

【问题描述】
有一排灯,一共n个,第一个灯的坐标是0,后面的灯的坐标递增,但不一定间隔是1。
每个灯的下面都有一个按钮,按下去之后灯会打开,过ti秒后会弹起来,灯会关闭。
求一个使得所有灯都按下去的字典序最小的序列。(在答案里,每个灯只能被按下去一次)
【输入格式】
第一行n。
第二行n个数字,表示ti。
第三行n个数字,表示每个灯的坐标,保证第一个灯坐标0,后面每个灯坐标递增。
【输出格式】
一行,n个数字,表示按下的序列。
【样例输入】
4
5 200 1 2
0 1 2 3
【样例输出】
1 2 4 3
【数据范围】
100%的数据保证n<=200
数据有梯度的上升

刚开始完全把题意理解错了(不过理解对了也写不出来wwwww)。经过1单位的路程要花费1单位时间,题目为求按一排灯的最小序列,考虑dp[i][j][0/1]表示处理完i~j区间消耗的最小时间,0/1表示停留在左端点还是右端点。再开一个path[i][j][0/1]数组辅助记录当前的dp数组由哪边转移过来方便输出。要按完一个区间时,证明先从左右端点按最优,如果从中间随意一个位置开始按则按区间左右端点时会走原来已走过的路,因此一定是从左右端点向内的按。

具体先枚举区间左端点i和右端点j,dp[i][j][0](停在左边)可以从dp[i+1][j][0]和dp[i+1][j][1]转移来,更新dp[i][j][0]值时path[i][j][0]记录从dp[i+1][j][0]还是dp[i+1][j][1]转移,之后判断dp值是否大于t[i],若大于则赋值为inf表明不可行。dp[i][j][1](停在右边)从dp[i][j-1][0]和dp[i][j-1][1]转移来,与t[j]比较。

输出时通过判断dp[1][n][0]和dp[1][n][1]的值是否小于inf来确定从哪个端点开始输出,开一个tmp变量记录此时的path值(若都不满足输出无解),之后while(l<=r)输出,细节是注意一下tmp应该赋值为path[0]还是path[1]。

猜你喜欢

转载自www.cnblogs.com/cubeconcept/p/11390432.html