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;
    }
posted @ 2021-08-16 07:32  5k_sync_closer  阅读(1)  评论(0编辑  收藏  举报  来源