蓝桥特训算法 位运算 课后习题 分糖果

 字典序:通俗易懂的来说就是按照查找字典的先后顺序排序

        例子一:aaaa与aaa,因为在字典查找的时候,aaa的第四位为空,而aaaa第四位有字符,所以比aaa多查找一次,故而aaa与aaaa的字典序排序为aaa>aaaa;

        例子二:aab与aaa,在字典中查找的过程中,b在字典中排在a的后面,所以aaa>aab;

具体代码实现:

#include<bits/stdc++.h>  
using namespace std;  
  
string ch;
int n, x;
  
int main() {  
    cin >> n >> x >> ch;  
  
    // 对字符串进行字典序排序  
    sort(ch.begin(), ch.end());  
  
    // 检查第0个字符和第x个字符是否不同  
    if (ch[0] != ch[x - 1]) {  
        // 如果不同,则输出第x个字符  
        cout << ch[x - 1];  
        return 0; // 输出后直接退出程序  
    }  
  
    // 输出排序后的第0个字符(也是最小的字符)  
    cout << ch[0];  
  
    // 检查第x个字符和最后一个字符是否不同  
    if (ch[x - 1] != ch[n - 1]) {  
        // 如果不同,则输出从第x个字符到字符串末尾的所有字符  
        for (int i = x; i < n; i++) {  
            cout << ch[i];  
        }  
    } 
    
	else {  
        // 如果第x个字符和最后一个字符相同,则输出若干个最后一个字符  
        // 注意:这里的逻辑可能不符合预期,因为(n-1)/x可能不是整数  
        for (int i = 0; i < (n - 1) / x; i++) {  
            cout << ch[n - 1];  
        }  
    }  
}

 实现逻辑:

        第一个判断,针对的一段不重复的字符串判断,比如abcdefg中,无论如何组合排列,最小的字典序字符串为c开头,因此直接输出最小的c便是答案

 if (ch[0] != ch[x - 1]) {  
        cout << ch[x - 1];  
        return 0; 
    }  

        第二个判断,便是判断前面几位都是大于后面一个字符串的情况,例如aabbcd,那么字典序排序中差值最小的方法为a与abbcd两个字符串,故abbcd字符串为最小值,输出即可

 if (ch[x - 1] != ch[n - 1]) {  
        for (int i = x; i < n; i++) {  
            cout << ch[i];  
        }  
    } 

第三个判断,便是判断整个字符串上的所有值是否相同,在sort(ch.begin(), ch.end());在字典序排序后如果第一位与最后一位的值相等,那么在整个字符串中的所有值相等,只需要根据分多少段排序即可,例如:aaaaa分为两段aaa与aa,然后输出aaa即可

else {   
        for (int i = 0; i < (n - 1) / x; i++) {  
            cout << ch[n - 1];  
        }  
    }  
  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值