天梯 L1 Practic1 题解合集

原创不易,未经允许,禁止转载。

博客主页:https://blog.csdn.net/Edviv

调和平均

题目链接

题目大意

N 个正数的算数平均是这些数的和除以 N,它们的调和平均是它们倒数的算数平均的倒数。本题就请你计算给定的一系列正数的调和平均值。

输入格式

每个输入包含 1 个测试用例。每个测试用例第 1 行给出正整数 N (≤1000);第 2 行给出 N 个正数,都在区间 [0.1,100] 内。

输出格式

在一行中输出给定数列的调和平均值,输出小数点后2位。

输入样例

8

10 15 12.7 0.3 4 13 1 15.6

输出样例

1.61

累计求 1.0 x \frac{1.0}{x} x1.0 , 最后答案就是 n a n s \frac{n}{ans} ansn

#include <bits/stdc++.h>
using namespace std;
int main()
{
    double n, x, ans = 0;
    scanf("%lf",&n);
    for(int i = 0; i < n; i++)
    {
        scanf(" %lf",&x);
        ans += 1.0/x;
    }
    printf("%.2f\n",n/ans);
    return 0;
}

寻找 250

题目链接

题目大意

对方不想和你说话,并向你扔了一串数…… 而你必须从这一串数字中找到 250 这个高大上的感人数字。

输入格式

输入在一行中给出不知道多少个绝对值不超过 1000 的整数,其中保证至少存在一个 250

输出格式

在一行中输出第一次出现的 250 是对方扔过来的第几个数字(计数从 1 开始)。题目保证输出的数字在整型范围内。

输入样例

888 666 123 -233 250 13 250 -222

输出样例

5

i s t r i n g s t r e a m 读 取 istringstream读取 istringstream

#include <bits/stdc++.h>
using namespace std;
int main()
{
    string s;
    getline(cin,s);
    istringstream ssin(s);
    int x, ans = 1;
    while(ssin >> x)
        if(x != 250) ans++;
        else break;
    printf("%d\n",ans);
    return 0;
}

幸运彩票

题目链接

题目大意

彩票的号码有 6 位数字,若一张彩票的前 3 位上的数之和等于后 3 位上的数之和,则称这张彩票是幸运的。本题就请你判断给定的彩票是不是幸运的。

输入格式

输入在第一行中给出一个正整数 N(≤ 100)。随后 N 行,每行给出一张彩票的 6 位数字。

输出格式

对每张彩票,如果它是幸运的,就在一行中输出 You are lucky!;否则输出 Wish you good luck.

输入样例

2

233008

123456

输出样例

You are lucky!

Wish you good luck.

s u b s t r substr substr 求子串

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        string s;
        cin>>s;
        string x = s.substr(0,3);
        string y = s.substr(3,3);
        int tx = 0, ty = 0;
        for(int i = 0; i < 3; i++)
        {
            tx += (int)(x[i] - '0');
            ty += (int)(y[i] - '0');
        }
        if(tx == ty) puts("You are lucky!");
        else puts("Wish you good luck.");
    }
    return 0;
}

敲笨钟

题目链接

题目链接

微博上有个自称“大笨钟 V ”的家伙,每天敲钟催促码农们爱惜身体早点睡觉。为了增加敲钟的趣味性,还会糟改几句古诗词。其糟改的方法为:去网上搜寻压 “ ong” 韵的古诗词,把句尾的三个字换成“敲笨钟”。例如唐代诗人李贺有名句曰:“寻章摘句老雕虫,晓月当帘挂玉弓”,其中“虫”( chong)和“弓”( gong)都压了“ ong”韵。于是这句诗就被糟改为“寻章摘句老雕虫,晓月当帘敲笨钟”。 现在给你一大堆古诗词句,要求你写个程序自动将压“ong”韵的句子糟改成“敲笨钟”。

输入格式

输入首先在第一行给出一个不超过 20 的正整数 N。随后 N 行,每行用汉语拼音给出一句古诗词,分上下两半句,用逗号 , 分隔,句号 . 结尾。相邻两字的拼音之间用一个空格分隔。题目保证每个字的拼音不超过 6 个字符,每行字符的总长度不超过 100,并且下半句诗至少有 3 个字。

输出格式

对每一行诗句,判断其是否压 “ ong” 韵。即上下两句末尾的字都是 “ ong” 结尾。如果是压此韵的,就按题面方法糟改之后输出,输出格式同输入;否则输出 Skipped,即跳过此句。

输入样例

5

xun zhang zhai ju lao diao chong, xiao yue dang lian gua yu gong.

tian sheng wo cai bi you yong, qian jin san jin huan fu lai.

xue zhui rou zhi leng wei rong, an xiao chen jing shu wei long.

zuo ye xing chen zuo ye feng, hua lou xi pan gui tang dong.

ren xian gui hua luo, ye jing chun shan kong.

输出样例

xun zhang zhai ju lao diao chong, xiao yue dang lian qiao ben zhong.

Skipped

xue zhui rou zhi leng wei rong, an xiao chen jing qiao ben zhong.

Skipped

Skipped

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin>>t;
    getchar();
    while(t--)
    {
        string s;
        getline(cin,s);
        int len = s.size(), cnt = 0;
        for(int i = 0; i < len; i++)
        {
            if(s[i] == ',' && s[i-1] == 'g' && s[i-2] == 'n' && s[i-3] == 'o')
                cnt++;
            if(s[i] == '.' && s[i-1] == 'g' && s[i-2] == 'n' && s[i-3] == 'o')
                cnt++;
        }
        if(cnt == 2)
        {
            int pos = 0, num = 0;
            for(int i = len; ~i; i--)
            {
                if(s[i] == ' ') num++, pos = i;
                if(num >= 3) break;
            }
            for(int i = 0; i <= pos; i++) cout<<s[i];
            cout<<"qiao ben zhong."<<'\n';
        }
        else puts("Skipped");
    }
    return 0;
}

天梯赛座位分配

题目链接

题目大意

天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情。为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] 支队伍,每队 10 位参赛选手。令每校选手排成一列纵队,第 i+1 队的选手排在第 i 队选手之后。从第 1 所学校开始,各校的第 1 位队员顺次入座,然后是各校的第 2 位队员…… 以此类推。如果最后只剩下 1 所学校的队伍还没有分配座位,则需要安排他们的队员隔位就坐。本题就要求你编写程序,自动为各校生成队员的座位号,从 1 开始编号。

输入格式

输入在一行中给出参赛的高校数 N (不超过 100 的正整数);第二行给出 N 个不超过 10 的正整数,其中第 i 个数对应第 i 所高校的参赛队伍数,数字间以空格分隔。

输出格式

从第 1 所高校的第 1 支队伍开始,顺次输出队员的座位号。每队占一行,座位号间以 1 个空格分隔,行首尾不得有多余空格。另外,每所高校的第一行按“#X”输出该校的编号 X,从 1 开始。

输入样例

3

3 4 2

输出样例

#1

1 4 7 10 13 16 19 22 25 28

31 34 37 40 43 46 49 52 55 58

61 63 65 67 69 71 73 75 77 79

#2

2 5 8 11 14 17 20 23 26 29

32 35 38 41 44 47 50 53 56 59

62 64 66 68 70 72 74 76 78 80

82 84 86 88 90 92 94 96 98 100

#3

3 6 9 12 15 18 21 24 27 30

33 36 39 42 45 48 51 54 57 60

坑点在于如果最后一组与前面一组差值等于1隔开坐就加2开始,否则最后剩下的第一个人不能直接跳过,这个人后面的人才是从加2直接开始坐。

#include <bits/stdc++.h>
using namespace std;
const int maxn = 107;
int a[maxn],b[maxn];
vector<int> sch[maxn];
int main()
{
    int n, tot = 0;
    scanf(" %d",&n);
    for(int i = 1; i <= n; i++) scanf(" %d",&a[i]), tot += a[i], b[i] = a[i];
    tot *= 10;
    sort(b+1,b+1+n);
    int cha = b[n] - b[n-1];
    int num = 1, peo = 0, cnt = 0, col = 0;
    while(peo < tot)
    {
        int t = 0;
        for(int i = 1; i <= n; i++) if(cnt >= a[i]) t++;
        for(int i = 1; i <= n; i++)
        {
            if(cnt < a[i])
            {
                if(t != n - 1) sch[i].push_back(num),num++;
                else if(n != 1) 
                {
                    if(cha == 1) sch[i].push_back(num+1);
                    else sch[i].push_back(num);
                    num += 2;
                }
                else sch[i].push_back(num), num += 2;
                peo++;
            }
        }
        col++;
        if(col%10 == 0) cnt++;
    }
    
    for(int i = 1; i <= n; i++)
    {
        printf("#%d\n",i);
        int k = 0;
        for(int j = 0; j < sch[i].size(); j++)
        {
            if(!k) printf("%d",sch[i][j]);
            else printf(" %d",sch[i][j]);
            k++;
            if(k%10 == 0) puts(""), k = 0;
        }
    }
    return 0;
}

情人节

题目链接

题目大意

214 情人节了,我决定造福大家。第 2 个赞和第 14 个赞的,我介绍你俩认识…………咱三吃饭…你俩请…”。现给出此贴下点赞的朋友名单,请你找出那两位要请客的倒霉蛋。

输入格式

输入按照点赞的先后顺序给出不知道多少个点赞的人名,每个人名占一行,为不超过 10 个英文字母的非空单词,以回车结束。一个英文句点.标志输入的结束,这个符号不算在点赞名单里。

输出格式

根据点赞情况在一行中输出结论:若存在第 2 个人 A 和第 14 个人 B,则输出“ A and B are inviting you to dinner...”;若只有 A 没有 B,则输出“ A is the only one for you...”;若连 A 都没有,则输出“ Momo... No one is for you ...”。

输入样例

GaoXZh

Magi

Einst

Quark

LaoLao

FatMouse

ZhaShen

fantacy

latesum

SenSen

QuanQuan

whatever

whenever

Potaty

hahaha

.

输出样例

Magi and Potaty are inviting you to dinner...

#include <bits/stdc++.h>
using namespace std;
string ss[100007];
int main()
{
    int p = 0;
    string s;
    while(getline(cin,s))
    {
        if(s == ".") break;
        ss[++p] = s;
    }
    if(p >= 14) cout<<ss[2]<<" and "<<ss[14]<<" are inviting you to dinner..."<<'\n';
    else if(p >= 2) cout<<ss[2]<<" is the only one for you..."<<'\n';
    else cout<<"Momo... No one is for you ..."<<'\n';
    return 0;
}

倒数第N个字符串

题目链接

题目大意

给定一个完全由小写英文字母组成的字符串等差递增序列,该序列中的每个字符串的长度固定为 L,从 La 开始,以 1 为步长递增。例如当 L3 时,序列为 {aaa, aab, aac, ..., aaz, aba, abb, ..., abz, ..., zzz }。这个序列的倒数第 27 个字符串就是 zyz。对于任意给定的 L,本题要求你给出对应序列倒数第 N 个字符串。

输入格式

输入在一行中给出两个正整数 L (2 ≤ L ≤ 6)N ( N ≤ 1e5)

输出格式

在一行中输出对应序列倒数第 N 个字符串。题目保证这个字符串是存在的。

输入样例

3 7417

输出样例

pat

#include <cstdio>
using namespace std;
char p[27];
int yu[10];
int main()
{
    char ch = 'a';
    for(int i = 0; i < 26; i++) p[i] = ch++;
    int l,n,idx = 0;
    scanf(" %d %d",&l,&n);
    n--;
    while(n > 0)
    {
        yu[++idx] = n%26;
        n /= 26;
    }
    int len = l - idx;
    for(int i = 0; i < len; i++) printf("z");
    for(int i = idx; i; i--) printf("%c",p[25-yu[i]]);
    return 0;
}

前世档案

题目链接

题目大意

网络世界中时常会遇到这类滑稽的算命小程序,实现原理很简单,随便设计几个问题,根据玩家对每个问题的回答选择一条判断树中的路径(如下图所示),结论就是路径终点对应的那个结点。

在这里插入图片描述

现在我们把结论从左到右顺序编号,编号从 1 开始。这里假设回答都是简单的“是”或“否”,又假设回答“是”对应向左的路径,回答“否”对应向右的路径。给定玩家的一系列回答,请你返回其得到的结论的编号。

输入格式

输入第一行给出两个正整数: N≤30)为玩家做一次测试要回答的问题数量; M≤100)为玩家人数。 随后 M 行,每行顺次给出玩家的 N 个回答。这里用 y 代表“是”,用 n 代表“否”。

输出格式

对每个玩家,在一行中输出其对应的结论的编号。

输入样例

3 4

yny

nyy

nyn

yyn

输出样例

3

5

6

2

父亲节点 p p p,左儿子 p ∗ 2 p*2 p2,右儿子 p ∗ 2 + 1 p*2+1 p2+1

#include <cstdio>
using namespace std;
int qsm(int a,int b)
{
    int res = 1;
    while(b)
    {
        if(b&1) res = res*a;
        a = a*a;
        b >>= 1;
    }
    return res;
}
char p[50];
int main()
{
    int n,m;
    scanf(" %d %d",&n,&m);
    while(m--)
    {
        scanf(" %s",p);
        int pos = 1;
        for(int i = 0; i < n; i++)
        {
            if(p[i] == 'y') pos <<= 1;
            else pos = pos << 1 | 1;
        }
        printf("%d\n",pos+1-qsm(2,n));
    }
    return 0;
}

刮刮彩票

题目链接

题目大意

“刮刮彩票”是一款网络游戏里面的一个小游戏。如图所示:

在这里插入图片描述

每次游戏玩家会拿到一张彩票,上面会有 9 个数字,分别为数字 1 到数字 9,数字各不重复,并以 3×3 的“九宫格”形式排布在彩票上。 在游戏开始时能看见一个位置上的数字,其他位置上的数字均不可见。你可以选择三个位置的数字刮开,这样玩家就能看见四个位置上的数字了。最后玩家再从 3 横、 3 竖、 2 斜共 8 个方向中挑选一个方向,方向上三个数字的和可根据下列表格进行兑奖,获得对应数额的金币。 现在请你写出一个模拟程序,模拟玩家的游戏过程。

输入格式

输入第一部分给出一张合法的彩票,即用 33 列给出 09 的数字。 0 表示的是这个位置上的数字初始时就能看见了,而不是彩票上的数字为 0。 第二部给出玩家刮开的三个位置,分为三行,每行按格式 x y 给出玩家刮开的位置的行号和列号(题目中定义左上角的位置为第 1 行、第 1 列。)。数据保证玩家不会重复刮开已刮开的数字。 最后一部分给出玩家选择的方向,即一个整数: 13 表示选择横向的第一行、第二行、第三行,4 至 6 表示纵向的第一列、第二列、第三列, 78分别表示左上到右下的主对角线和右上到左下的副对角线。

输出格式

对于每一个刮开的操作,在一行中输出玩家能看到的数字。最后对于选择的方向,在一行中输出玩家获得的金币数量。

输入样例

1 2 3

4 5 6

7 8 0

1 1

2 2

2 3

7

输出样例

1

5

6

180

#include <bits/stdc++.h>
using namespace std;
int vis[10];
int a[10][10];
int money[26];
void init()
{
    money[6] = 10000; money[7] = 36; money[8] = 720; money[9] = 360;
    money[10] = 80; money[11] = 252; money[12] = 108; money[13] = 72;
    money[14] = 54; money[15] = 180; money[16] = 72; money[17] = 180;
    money[18] = 119; money[19] = 36; money[20] = 306; money[21] = 1080;
    money[22] = 144; money[23] = 1800; money[24] = 3600;
}
int main()
{
    init();
    for(int i = 1; i <= 3; i++)
        for(int j = 1; j <= 3; j++)
        {
            int t;
            scanf("%d",&t);
            a[i][j] = t;
            vis[t] = 1;
        }
    for(int i = 1; i <= 3; i++)
        for(int j = 1; j <= 3; j++)
            if(!a[i][j])
                for(int k = 1; k <= 9; k++)
                    if(!vis[k]) a[i][j] = k;
    for(int i = 1; i <= 3; i++)
    {
        int x,y;
        scanf(" %d %d",&x,&y);
        printf("%d\n",a[x][y]);
    }
    int k;
    scanf("%d",&k);
    int tot = 0;
    if(k == 1) tot = a[1][1] + a[1][2] + a[1][3];
    if(k == 2) tot = a[2][1] + a[2][2] + a[2][3];
    if(k == 3) tot = a[3][1] + a[3][2] + a[3][3];
    if(k == 4) tot = a[1][1] + a[2][1] + a[3][1];
    if(k == 5) tot = a[1][2] + a[2][2] + a[3][2];
    if(k == 6) tot = a[1][3] + a[2][3] + a[3][3];
    if(k == 7) tot = a[1][1] + a[2][2] + a[3][3];
    if(k == 8) tot = a[1][3] + a[2][2] + a[3][1];
    printf("%d\n",money[tot]);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

幸愉聊信奥

谢谢亲的支持,我会继续努力啦~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值