蓝桥杯 双周赛 第16场 强者赛 题目复盘 (2024年8月10日)

6. 花魁之争


解题思路:

根据题意,对于每一次操作,每个仙女来说都取最优解,那第一次每个仙女都操作一次,这时候胜出的仙女,是一定赢的。所以,只要计算n个字符串操作一次的最优字符串,然后,选出最小字符串有几个就是答案。

如何操作一次,支付串字典序最小?

  1. 存在这样的i和j,直接交换
    i < j && s[ i ] > s[ j ]
    s[j]尽量小的情况下j尽量大
  2. 存在两个相同的字符(容易漏掉)
  3. 交换最后两个字符(容易漏掉)
c 复制代码
#include <iostream>
#include<vector>
using namespace std;

const int N = 1e5 + 10;
vector<string> vs;
int n;
string cal(string &s) {
  vector<int> ps[26];
  int len = s.size();
  for (int i = 0; i < len; i++) {
    ps[s[i] - 'a'].push_back(i);
  }
  for (int i = 0; i < len; i++) {
    for (int j = 0; j < s[i] - 'a'; j++) {
      int tl = ps[j].size();
      if (tl && ps[j][tl - 1] > i) {
        swap(s[i], s[ps[j][tl - 1]]);
        return s;
      }
    }
  }
  for (int i = 0; i < 26; i++) {
    if (ps[i].size() > 1) return s;
  }
  swap(s[len - 1], s[len - 2]);
  return s;
}
int main()
{
  string s, mi = "";
  cin >> n;
  int ans = 0;
  for (int i = 0; i < n; i++) {
    cin >> s;
    s = cal(s);
   // cout << s <<endl;
    if (mi == "" || mi > s) {
      mi = s;
      ans = 1;
    }else if (mi == s) ans++;
  }
  cout << ans;
  return 0;
}
相关推荐
荒古前27 分钟前
龟兔赛跑 PTA
c语言·算法
Colinnian30 分钟前
Codeforces Round 994 (Div. 2)-D题
算法·动态规划
用户00993831430136 分钟前
代码随想录算法训练营第十三天 | 二叉树part01
数据结构·算法
shinelord明40 分钟前
【再谈设计模式】享元模式~对象共享的优化妙手
开发语言·数据结构·算法·设计模式·软件工程
დ旧言~1 小时前
专题八:背包问题
算法·leetcode·动态规划·推荐算法
小俊俊的博客1 小时前
海康RGBD相机使用C++和Opencv采集图像记录
c++·opencv·海康·rgbd相机
_WndProc1 小时前
C++ 日志输出
开发语言·c++·算法
薄荷故人_1 小时前
从零开始的C++之旅——红黑树及其实现
数据结构·c++
m0_748240021 小时前
Chromium 中chrome.webRequest扩展接口定义c++
网络·c++·chrome