天梯赛补题

情人节


在这里插入图片描述

以上是朋友圈中一奇葩贴:“2月14情人节了,我决定造福大家。第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 ...”

输入样例1:

GaoXZh
Magi
Einst
Quark
LaoLao
FatMouse
ZhaShen
fantacy
latesum
SenSen
QuanQuan
whatever
whenever
Potaty
hahaha
.

输出样例1:

Magi and Potaty are inviting you to dinner...

输入样例2:

LaoLao
FatMouse
whoever
.

输出样例2:

FatMouse is the only one for you...

输入样例3:

LaoLao
.

输出样例3:

Momo... No one is for you ...

注解:
其实有一个误区,就是开一个二维数组,用来储存所有的输入的字符串,太笨了,依据题干,我们只需要储存第二个和第十四个字符串就ok,虽然题不难,但是这个解决主要矛盾的思想很重要

代码

#include<bits/stdc++.h>
using namespace std;
string yi, er, a;
int flag1, flag2, res;
int main()
{
    
    
    while(cin >> a)
    {
    
    
        if(a == ".") break; //注意这里不是'.'而是".";
        res ++ ;
        if(res == 2 )
        {
    
    
            flag1 = 1;
            yi = a;
        }
        else if(res == 14 )
        {
    
    
            flag2 = 1;
            er = a;
        }
    }
    if(flag1 && flag2 ) cout << yi << " and " << er << " are inviting you to dinner..." << endl;
    else if(flag1 && !flag2) cout << yi <<" is the only one for you..." << endl;
    else cout << "Momo... No one is for you ..." << endl;   
    return 0;
}

一个小小的注解:c ++ 中的string不可以用printf输出,只能用cout << "" << endl;输出

N个数求和


题干:
本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。

输入格式:

输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1 a2/b2 …给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。
输出格式:

输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分,其中分数部分写成分子/分母,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。
输入样例1:

5
2/5 4/15 1/30 -2/60 8/3

输出样例1:

3 1/3

解析:暴力的方法
代码:

#include<bits/stdc++.h>
using namespace std;
long long int fz, fm, resfz, resfm;
long long int n;
int main()
{
    
    
    cin >>n;
    for(int i = 0; i < n; i ++ )
    {
    
    
        scanf("%lld/%lld", &fz, &fm);
        if(i == 0)
        {
    
    
            resfz = fz;
            resfm = fm;
        }
        else
        {
    
    
            resfz = fm * resfz + fz * resfm;
            resfm = resfm * fm;
        }
        for(long long int i = 2; i <= max(resfm, resfz); i ++ )
        {
    
    
            while (resfz % i == 0 && resfm % i == 0)
            {
    
    
                resfz /= i;
                resfm /= i;
            }
        }
    }
    long long int z = resfz / resfm;
    resfz %= resfm;
    for(long long int i = 2; i <= max(resfz, resfm); i ++ )
    {
    
    
        while (resfz % i == 0 && resfm % i == 0)
        {
    
    
            resfz /= i;
            resfm /= i;
        }
    }
    if(z && resfz) cout << z << " " << resfz << "/" << resfm << endl;
    else if(z && !resfz) cout << z << endl;
    else if(!z && resfz) cout << resfz << "/" << resfm << endl;
    else if(!z && !resfz) cout << 0 << endl;
    return 0;
}

注解:在输入的过程中就夹杂着通分的过程,一边输入,先暴力相加,然后再用for循环暴力约分.

倒数第N个字符串

Problem Description:

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

Input:

输入在一行中给出两个正整数L(2 <= L <= 6)N(<= 105)

Output:

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

Sample Input:

3   7417

Sample Output:

pat

解析:
1.输入n位数,那么最后得到的总共的全排列个数为 2 6 n 26^n 26n
2.总共的次序个数已知为m,要求的倒数第几个也已知,用26^n-m记为要求的正数第几个次序,这里用x表示
3.对其x关于26进行求余数得到的结果加上'a'就能得到最后一个字母是什么,每次对这个总体次序个数进行削减26,既为下一个位置的字母,以此类推,代码如下:

My solution

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
char a[N];
long long int flag, x, y, l, n, m = 1;
int main()
{
    
    
    cin >> l >> n;
    for(int i = 0; i < l; i ++ )m *= 26;
    n = m - n;
    flag = l;
    while(l -- )
    {
    
    
        x = n % 26;
        a[l] = 'a' + x;
        n /= 26;
    }
    for(int i = 0; i < flag; i ++ ) cout << a[i];
}

人以群分


题干:
社交网络中我们给每个人定义了一个“活跃度”,现希望根据这个指标把人群分为两大类,即外向型(outgoing,即活跃度高的)和内向型(introverted,即活跃度低的)。
要求两类人群的规模尽可能接近,而他们的总活跃度差距尽可能拉开。

输入格式:

输入第一行给出一个正整数N(2≤N≤10​5​​)。随后一行给出N个正整数,分别是每个人的活跃度,其间以空格分隔。题目保证这些数字以及它们的和都不会超过2​^31​​

输出格式:

按下列格式输出:

Outgoing #: N1
Introverted #: N2
Diff = N3

其中N1是外向型人的个数;N2是内向型人的个数;N3是两群人总活跃度之差的绝对值。

输入样例1:

10
23 8 10 99 46 2333 46 1 666 555

输出样例1:

Outgoing #: 5
Introverted #: 5
Diff = 3611

思路:取中间值mid作为分界线,左半部分为内向者,右半部分为外向者由于数据量大,所以用冒泡会有有两个测试点超时,用sort(a, a + n)函数处理即可

My Solution

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n;
int a[N];
int sum1, sum2, mid, ans, r;
int main()
{
    
    
    cin >> n;
    for(int i = 0; i < n; i ++ ) cin >> a[i];
    sort(a, a + n);
    mid = n / 2;
    r = n - mid;
    for(int i = 0; i < mid; i ++ )
    {
    
    
        sum1 += a[i];
    }
    for(int i = mid; i < n; i ++)
    {
    
    
        sum2 += a[i];
    }
    ans = sum2 - sum1;
    cout << "Outgoing #: " << r << endl;
    cout << "Introverted #: " << mid << endl;
    cout << "Diff = " << ans << endl;
}

猜你喜欢

转载自blog.csdn.net/qq_51960163/article/details/115219547