蓝桥杯[OJ 2928]分糖果-CPP(贪心、字典序)

文章介绍了如何根据字典序比较规则,理解题目的要求,对糖果进行分类讨论,然后编写C++代码解决一个分配问题,即找到字典序最大且与其他人糖果组合相差最小的字符串输出。
摘要由CSDN通过智能技术生成

目录

一、题目描述:

二、整体思路

        (一)字典序比较规则

       (二)正确理解题意

    (三)分类讨论

三、代码


一、题目描述:

二、整体思路

        (一)字典序比较规则

        首先要知道字典序是怎么比较大小的,简单来说按以下次序进行比较:

  1. 两个字符串第一个不同的字母决定:如ab<ad,abcd<abcf
  2. 两个字符串同样位置没有不同的字母,按长度决定:如ab<abc,sde<sdeg    

       (二)正确理解题意

        其次要明白题目在说啥,实际上就是要输出一个长度最长的,字典序比其他糖果组成的字符串大的但是相差最小的字符串。比如abd字典序大于abc,但是不是字典序相差最小的(c与d),字典序相差最小的是abbcd与a(a与b)。

    (三)分类讨论

        为了方便比较,先把所有糖果按字典序排序

  1. 遍历所有糖果,每个人拿到的第一颗糖果有不同的。那么不管后面有没有糖果,最后拿到糖果的哪个人就是字典序最大的,如
    n=6,x=3,S=“aabdas”
    每个人第一颗糖果情况为:
    a
    a
    b
    这时无论剩下的糖果d、a、s怎么分配,b都是字典序最大的糖果组成的字符串,直接输出b即可
  2. 每个人拿到的第一颗糖果相同,剩下的糖果每颗都是相同的(剩下的糖果不一定与每个人第一颗糖果相同),那么就要把糖果尽可能分散到每个人手里来使得目标字符串长度最小,如
    n=6,x=3,S=“aaabbb”
    最佳分配情况为
    ab
    ab
    ab
  3. 每个人拿到的第一颗糖果相同,剩下的糖果存在不相同的糖果,如样例输入的情况,那么就要按字典序把相同的糖果平均分配给每个人,直到剩下糖果堆里出现第一种数量不足以均分给所有人的糖果。
    此时把剩下所有糖果都分给同一个人,确保字典序相差最小。
    如n=6,x=2,S="aabccd"
    abccd
    a

三、代码

#include <bits/stdc++.h>
using namespace std;
int main()
{
  // 请在此输入您的代码
  int n,x;cin>>n>>x;
  string s;cin>>s;
  sort(begin(s),end(s));
  if(s[0]!=s[x-1]){
    cout<<s[x-1];//第一个糖果有不同的情况
  }else{//第一颗糖果都相同
    if(s[x]==s[n-1]){//第一颗糖果相同,剩下的糖果都是同一种糖果
      cout<<s[x];
      for(int i=x;i<=n-1;i+=x){//剩下的糖果均分给每个人
        cout<<s[i];
      }
    }else{//最后一种情况,剩下的糖果全部堆给一个人
      for(int i=x-1;i<=n-1;i++){
        cout<<s[i];
      }
    }
  }
  return 0;
}

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值