#2019级第二次月赛暨软件计科联合新生赛#

唉……想喂自己一口毒鸡汤


A.帮助kiki

看看题面:

描述:
kuku送给kiki一串宝石,kiki发现每次可以从宝石序列中取出正好是相同类型的
三个连续的宝石,在拿走三颗宝石之后,原始序列的左右两部分将自动按原始顺
序合并为一个序列。聪明的kuku当然知道这一点并且提前知道合并的次数和宝石
最终的样子。可爱的kiki很想知道自己最多需要合并几次才能得到最终的宝石序
列,但是又不敢问kuku,所以这个问题只能交给同样聪明的你来解决。
输入:
只有一行字符串s(1≤∣s∣≤10^5),表示宝石序列,其中相同的字母视为相同的类型。
(仅包含大写字母)
输出:
一行包含一个整数n和一个字符串m用空格隔开,表示kiki最多需要合并n次会
得到最终的宝石序列m。(如果合并之后的宝石序列大小为0,kiki会很伤心,
这个时候你需要输出qwq)。
输入样例 1                    输出样例 1
ACMMMCCAANNB                 3 NNB
输入样例 2                    输出样例 2
QQQQWQQQQ                    2 QWQ
输入样例 3                    输出样例 3
ABBBAACCC                    3 qwq
提示:
样例一的一种可能的方式是:
ACMMMCCAANNB→ACCCAANNB→AAANNB→NNB

看了大佬的题解,将本题用栈的原理来做,有连续三个相同就删除,剩下的部分即为所应得的部分,还要注意题目中宝石序列为0的时候的状态,看看代码吧:

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
#define hhh 100005
char a[hhh],b[hhh];
int main(){
   
    while(~scanf("%s",a)){
   //多组;
        int j=0,num=0;
        int l=strlen(a);
        for(int i=0;i<l;i++){
   
            b[j++]=a[i];
            if(b[j-1]==b[j-2]&&b[j-1]==b[j-3]&&j>=3){
   
                j=j-3;//判断是不是有三个连续的相同字母,有就将他们全部“删了”,即j回到三个之前重新加入下一个字母;
                num++;//统计删掉三个连续字母的次数;
            }
        }
        if(j==0){
   
            printf("%d qwq",num);//若b中删啊删啊的删完了,就输出次数以及qwq;
        }
        else{
   
            printf("%d ",num);
            for(int i=0;i<j;i++){
   
                printf("%c",b[i]);//依次输出未被删除的字母;
            }
        }
        printf("\n");
    }
    return 0;
}

B.kuku吃糖果

这题和之前做过的差不多,都是思路题??看题面:

描述:
众所周知kuku喜欢吃糖果,但是kuku吃糖果也是有原则的,他不会连续吃相同的糖果。比如
kuku第一次吃了一个A这种糖果,那么他第二次就不会再吃A这种糖果了,但是他第三次可以
继续吃A这种糖果(连续的两次吃的糖果种类不能相同),现在告诉你kuku手中的糖果种类以
及每种糖果的个数,他是否能把他的糖果数吃完?如果能吃完就输出 "Yes",否则输出“No"
(输出不用把双引号输出)
输入:
t(1≤t≤5)组输入,对于每组输入 第一行输入一个正整数n(1≤n≤10^6 )表示kuku拥有的糖果种类
接下来一行输入n个数,第i个数ai表示第i类糖果的个数(1≤ai≤10^6)。
输出:
如果kuku能吃完糖果输出Yes,否则输出No。
输入样例 1                 输出样例 1
2                         No
3                         Yes
4 1 1
5
5 4 3 2 1

这题首先得注意数组范围 10^6 ,既然这个那么大了,说明里边的数据操作也很大,所以用long long最保险。整体是思路题,即当数量最大的糖果的数量大于剩余别的种类的糖果量总和加一时,注定会吃到连着的两颗最大种的糖果,所以判断该种情况为No,反之为Yes。看代码:

#include<bits/stdc++.h>
using namespace std;
bool cmp(long long x,long long y){
   
    return x>y;
}
long long a[1000010];
int main(){
   
    long long t,n;
    scanf("%lld",&t);
    while(t--){
   
        memset(a,0,sizeof(a));
        long long sum=0;
        scanf("%lld",&n);
        for(long long i=0;i<n;i++){
   
            scanf("%lld",&a[i]);
            sum+=a[i];
        }
        sort(a,a+n,cmp);
        if(a[0]>sum-a[0]+1){
   
            printf("No\n");
        }
        else{
   
            printf("Yes\n");
        }
    }
    return 0;
}

C.kuku会读数

kantimuna:

描述:
卖火柴的lly火柴卖完了(\[斜眼笑]),现在kuku有一个时钟使用标准的7段LCD显示屏显示所有数字,
外加两个小段显示":",并以24小时格式显示所有时间。问题很简单,你只需要读数就行了。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191205160006225.png)
输入:
输入的第一行包含一个整数t(1≤t≤200),表示测试用例的数量。
在每个测试用例中,时钟屏幕都有一个7×21 ASCII图像。
所有数字段均由两个字符表示,每个冒号段均由一个字符表示。
字符"X"表示分段,而"."则表示其他任何内容。
有关详细信息,请参见样本输入。
输出:
对于每个测试用例,以HH:MM格式打印一行包含字符串T,其中T(0000≤T≤2359)
表示时钟上显示的时间。
输入样例 1                             输出样例 1
2                                     02:38
.XX...XX.....XX...XX.                 12:39
X..X....X......X.X..X
X..X....X.X....X.X..X
......XX.....XX...XX.
X..X.X....X....X.X..X
X..X.X.........X
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值