题解 | #小欧安排座位#

小欧安排座位

https://www.nowcoder.com/practice/f90a4314d03f434f93f54b918304f97e

首先考虑尽可能的满足想换座位的人

我们将想换座位的人单独记录下来,然后将其循环打乱,就是给第一个人最后一个人的座位,第二个人第一个人的座位,以此类推

发现很像第一天的最后一题,我们维护一个map给每个需要换座位的人自己到自己的映射,然后将其错位swap即可,实现非常的简单

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5 + 5;
int __t = 1, n;
string s;
void solve() {
    cin >> n >> s;
    map<int, int> mp;
    for (int i = 1; i <= n; i++)
        if (s[i - 1] == '1')
            mp[i] = i;
    int ov = mp.rbegin()->second;
    for (auto& [k, v] : mp)
        swap(v, ov);
    for (int i = 1; i <= n; i++)
        cout << (mp[i] ? mp[i] : i) << " \n"[i == n];
    return;
}
int32_t main() {
#ifdef ONLINE_JUDGE
    ios::sync_with_stdio(false);
    cin.tie(0);
#endif
    // cin >> __t;
    while (__t--)
        solve();
    return 0;
}

全部评论
代码简洁明了
1 回复 分享
发布于 2024-11-21 16:22 黑龙江

相关推荐

评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务