蓝桥杯 双周赛 第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;
}
相关推荐
浮生如梦_1 小时前
Halcon基于laws纹理特征的SVM分类
图像处理·人工智能·算法·支持向量机·计算机视觉·分类·视觉检测
励志成为嵌入式工程师3 小时前
c语言简单编程练习9
c语言·开发语言·算法·vim
捕鲸叉3 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer3 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
Peter_chq3 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
wheeldown4 小时前
【数据结构】选择排序
数据结构·算法·排序算法
青花瓷5 小时前
C++__XCode工程中Debug版本库向Release版本库的切换
c++·xcode
观音山保我别报错5 小时前
C语言扫雷小游戏
c语言·开发语言·算法
幺零九零零6 小时前
【C++】socket套接字编程
linux·服务器·网络·c++
TangKenny6 小时前
计算网络信号
java·算法·华为