蓝桥杯 双周赛 第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;
}
相关推荐
代码游侠12 分钟前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
想进个大厂16 分钟前
代码随想录day37动态规划part05
算法
sali-tec17 分钟前
C# 基于OpenCv的视觉工作流-章22-Harris角点
图像处理·人工智能·opencv·算法·计算机视觉
子春一27 分钟前
Flutter for OpenHarmony:构建一个 Flutter 四色猜谜游戏,深入解析密码逻辑、反馈算法与经典益智游戏重构
算法·flutter·游戏
MZ_ZXD00140 分钟前
springboot旅游信息管理系统-计算机毕业设计源码21675
java·c++·vue.js·spring boot·python·django·php
人道领域1 小时前
AI抢人大战:谁在收割你的红包
大数据·人工智能·算法
TracyCoder1231 小时前
LeetCode Hot100(34/100)——98. 验证二叉搜索树
算法·leetcode
A尘埃1 小时前
电信运营商用户分群与精准运营(K-Means聚类)
算法·kmeans·聚类
A星空1232 小时前
一、Linux嵌入式的I2C驱动开发
linux·c++·驱动开发·i2c
凡人叶枫2 小时前
C++中智能指针详解(Linux实战版)| 彻底解决内存泄漏,新手也能吃透
java·linux·c语言·开发语言·c++·嵌入式开发