CF412A Poster
较水的贪心+模拟,而且没感觉有多少细节啊。
贪心策略
尽量让画家到达一个端点,然后依次画到另一边。
这样就可以保证移动距离是 $min(k-1,n-k)+|n|$。
我们知道,$|n|$ 的距离是无法避免的,而且是画完的最优方案。
那么为了达成这个方案,就要移动到更近的端点。
这样就可以保证方案是最优的。
实现思路
找个 $mid=n>>1$,判断 $k$ 与 $mid$ 的关系。
如果 $k≤mid$,就找左端点,然后往右画。
否则就找右端点,然后往左画。
如果非要说有细节,那就这么几个:
- 因为下标从 1 开始,可以在字符串前面加个占位符。
- 注意 while 循环的条件。
- 注意画最短点的字符。
#include <iostream> #include <string> #define l cout << "LEFT" << endl, --k #define r cout << "RIGHT" << endl, ++k; #define p(x) cout << "PRINT " << s[x] << endl using namespace std; int n, k, mid;string s; int main() { cin >> n >> k >> s; s = ' ' + s;mid = n >> 1; if(k <= mid) { while(k > 1) l; while(k < n) p(k), r; p(n); } else { while(k < n) r; while(k > 1) p(k), l; p(1); } return 0; }