PTA 520 钻石争霸赛 2022_521序列 pta-程序员宅基地

技术标签: 算法  补题  c++  c语言  

7-1 520表白 

在 520 这个日子里,拼题 A 请你实现一个小功能,帮助用户向自己喜欢的数字表白。

输入格式:

输入在一行中给出一个不超过 1000 的正整数 N,是用户最喜欢的一个数字。

输出格式:

在一行中按以下格式输出对 N 的表白:

N! 520!

输入样例:

233

输出样例:

233! 520!

 AC代码

#include <iostream>

using namespace std;


int main() {
    int n;
    cin >> n;
    cout << n << "! 520!" << endl;
    return 0;
}

7-2 分糖豆

N 个宝宝分 M 颗 m&m 糖豆,如果每人分 K 个,够不够分呀?

输入格式:

输入在一行中给出 3 个正整数,分别是 N(不超过 100),是宝宝们的总人数;M(不超过 1000),是糖豆的总颗数;K(不超过 10),是要分给每个宝宝的糖豆数。

输出格式:

如果每人 K 个正好能够分完,输出 zheng hao mei ren K!;如果分完了还剩 X 颗糖豆,则输出 hai sheng X!;如果不够分的,还差 X 颗糖豆,则输出 hai cha X!

输入样例 1:

10 50 5

输出样例 1:

zheng hao mei ren 5!

输入样例 2:

12 30 2

输出样例 2:

hai sheng 6!

输入样例 3:

15 40 3

输出样例 3:

hai cha 5!

 AC代码

#include <iostream>

using namespace std;

int N, M, K;

int main() {
    cin >> N >> M >> K;

    if (N * K == M) {
        cout << "zheng hao mei ren " << K << "!\n";
    } else if (N * K < M) {
        cout << "hai sheng " << M - N * K << "!\n";
    } else if (N * K > M) {
        cout << "hai cha " << N * K - M << "!\n";
    }

    return 0;
}

7-3 约会App

在 520 这个日子里,没有比开发一个约会 App 更合适做的事情了。这个软件的需求很简单,用户输入自己的性别、想要约会的异性的年龄范围 [a,b]、身高范围 [c,d],你要帮用户筛选出系统中满足其约会条件的所有异性。注意:性别、年龄、身高的要求必须全都符合要求才可以。

输入格式:

输入第一行首先给出一个用户自己输入的信息,格式如下:

性别 a b c d

其中 性别 为 0 表示女性,1 表示男性,是该用户自己的性别;后面四个数字依次表示该用户想要约会的异性的年龄下限、年龄上限、身高下限、身高上限 —— 注意这里的范围都是闭区间。

随后一行给出一个正整数 N≤100,随后 N 行,每行给出一位系统中登记的约会对象的信息,格式如下:

性别 年龄 身高

这里保证年龄和身高(包括上、下限)均为不超过 200 的正整数,同行数字间以 1 个空格分隔。

输出格式:

按照输入的顺序,输出每个满足用户约会条件的约会对象的信息,输出格式与输入格式相同。题目保证至少有一个人可以被输出。

输入样例:

1 20 25 160 175
6
0 28 165
1 21 170
0 25 160
0 22 180
1 20 175
0 20 175

输出样例:

0 25 160
0 20 175

 AC代码

//from Spare lin
#include <iostream>

using namespace std;

int N, sexUser, sexObj, a, b, c, d, age, height;

int main() {

    cin >> sexUser >> a >> b >> c >> d;
    cin >> N;
    while (N--) {
        cin >> sexObj >> age >> height;
        if (age >= a && age <= b && height >= c && height <= d && sexObj != sexUser) {
            cout << sexObj << ' ' << age << ' ' << height << "\n";
        }
    }
    return 0;
}

7-4 关于奇数的等式 

给定任一正奇数 n>3 和一个解的上界 m>3,求三个正奇数 x、y、z,满足 0<x<y<z≤m 且有等式 3/n=1/x+1/y+1/z。

输入格式:

输入给出正奇数 3<n<400 和解的上界 m≤1000。

输出格式:

在一行中输出给定范围内最小的一组解 x y z(即存在多组解时取最小的 x,并列时取最小的 y)。数字间以 1 个空格分隔,行首尾不得有多余空格。

如果给定范围内无解,则输出 No solution in (3, m]. 其中 m 是给定的上界。

输入样例 1:

27 500

输出样例 1:

11 55 495

输入样例 2:

27 50

输出样例 2:

No solution in (3, 50].

思路:三重循环暴力即可 注意精度问题 需要通分

 AC代码

#include <iostream>

using namespace std;

int n, m, flag = 0;

int main() {
    cin >> n >> m;
    for (int x = 1; x < m; x += 2) {
        for (int y = x + 2; y < m; y += 2) {
            for (int z = y + 2; z < m; z += 2) {
                if (3.0 == (1.0 / x + 1.0 / y + 1.0 / z) * n) {
                    cout << x << ' ' << y << ' ' << z << "\n";
                    flag = 1;
                    return 0;
                }
            }
        }
    }
    if (flag == 0) {
        cout << "No solution in (3, " << m << "].\n";
    }
    return 0;
}

7-5 我侬数

元初的中国书画大家赵孟頫的妻子管道升曾经写过一首脍炙人口的《我侬词》,词中道:“把一块泥,捻一个你,塑一个我。将咱们两个一齐打破,用水调和。再捏一个你,再塑一个我。我泥中有你,你泥中有我。”

给定一对正整数 A 和 B,将它们的各位数字收集到一起,再重新分成两个数 A′ 和 B′,我们称这样的 A′ 和 B′ 互为基于 A 和 B 的“我侬数“。本题就请你判断任一对数字是否是基于给定 A 和 B 的“我侬数“。

输入格式:

输入首先在第一行中给出两个不超过 104 位的正整数 A 和 B,为“我侬数“的基础数。随后每行给出一对不超过 2×104 位的正整数 A′ 和 B′。数字间以 1 个空格分隔。

输入以一对 0 结束,这一对 0 不要处理。题目保证至少有一对需要判定的数字。

输出格式:

对每一对 A′ 和 B′,判断其是否是基于给定 A 和 B 的“我侬数“。如果是,则在一行中输出 Yes,否则输出 No

注意:所有数字均不考虑前导 0。例如 A=101,B=2021,则我们不能判定 012 和 0121 为“我侬数“。

输入样例:

521212577999 21100008482136
521212577999 21100008482136
00210908482136 512121257799
123456789012597890 11100222
786238645254 19024781758903
21100008482136 521212577999
90 52121257792110008482136
0 0

输出样例:

Yes
No
Yes
No
Yes
No

 思路:要判断时候为我题意要求的我侬数 ,只需对去前导0后的字符串中的0 - 9进行计数

            若二者的计数一样则输出Yes 否则输出No

AC代码

#include <iostream>
#include <algorithm>
#include <string>
#include <map>

using namespace std;

map<char, int> mp, mp1;
string a, b, ax, bx;

string eraseString(string temp) {
    int index = 0;
    for (index = 0; index < temp.size() - 1; ++index) {
        if (temp[index] != '0') break;
    }
    temp.erase(0, index);
    return temp;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    cin >> a >> b;
    //cout << eraseString(a) << " " << eraseString(b) << "\n";
    string ans = eraseString(a) + eraseString(b);
    for (int i = 0; i < ans.length(); i++) mp[ans[i]]++;
    while (cin >> ax >> bx) {
        string temp = eraseString(ax) + eraseString(bx);
        if (temp == "00") break;
        for (int i = 0; i < temp.size(); i++)
            mp1[temp[i]]++;
        if (mp == mp1) cout << "Yes" << '\n';
        else cout << "No" << '\n';
        mp1.clear();
    }
    return 0;
}

7-6 非诚勿扰

“非诚勿扰”是江苏台一款非常受欢迎的相亲节目,台上的女嘉宾们可以从出场的男嘉宾中选择自己喜欢的牵手离开。问题是怎样才能选到最适合自己的男嘉宾呢?这是个概率问题。

解决这个问题有一种随机算法:假设女嘉宾知道自己最多能在台上录几期节目,也就知道自己最多能见到 N 位男嘉宾,那么她可以选择一个随机数 R(<N),对她见到的前 R 位男嘉宾,一个都不牵,只是以他们中最合适的那位作为一个标准,从第 R+1 位男嘉宾开始,只要遇到一个比标准更合适的,就决定牵手。理论上可以证明,当 R=N/e (其中 e 是自然常数,约等于 2.718)时,这样做能牵手最合适的男嘉宾的概率最高。

本题就请你根据男嘉宾的出场顺序,预测一下女嘉宾会牵手哪一位。

输入格式:

输入首先在第一行中给出正整数 N(3≤N≤104),即男嘉宾的数量。第二行给出 N 个互不相同的正整数,第 i 个数字表示第 i 位男嘉宾在女嘉宾心目中的得分。数字均不超过 105,之间以空格分隔。

输出格式:

女嘉宾将以 R=⌊N/e⌋ 为线,采用题面中描述的算法选择牵手的男嘉宾。这里我们取 e=2.718。请在一行中输出她牵手的男嘉宾的序号和真正最适合她的男嘉宾的序号(从 1 开始),数字间以 1 个空格分隔。

如果她一直没有遇到比标准更合适的人,就会独自离开,此时对应的序号输出为 0

输入样例 1:

10
23 84 15 29 17 56 85 40 91 28

输出样例 1:

7 9

输入样例 2:

10
56 85 17 23 84 15 29 40 31 28

输出样例 2:

0 2

 思路:按照题目依次遍历即可~

 AC代码

#include <iostream>

using namespace std;

const int MAXN = 1e4 + 7;
const double e = 2.718;
int N, R, arr[MAXN];

int main() {
    cin >> N;
    for (int i = 1; i <= N; i++) {
        cin >> arr[i];
    }
    R = N / e;
    int maxPoints = -1;
    for (int i = 1; i <= R; i++) {
        if (maxPoints < arr[i]) {
            maxPoints = arr[i];
        }
    }
    int ansPos1, ansPos2, flag = 0;
    for (int i = R + 1; i <= N; i++) {
        if (maxPoints < arr[i]) {
            ansPos1 = i;
            flag = 1;
            break;
        }
    }
    int maxScore = -1;
    for (int i = 1; i <= N; i++) {
        if (maxScore < arr[i]) {
            maxScore = arr[i];
            ansPos2 = i;
        }
    }
    if (flag == 0) ansPos1 = 0;
    cout << ansPos1 << ' ' << ansPos2 << endl;
    return 0;
}

7-7 新式六合彩

新式六合彩跟传统六合彩其实没有半点关系,只是姥姥为了出题杜撰出来的一种玩法——每位玩家可以下注一个六位数,如果跟开出来的幸运六位数最接近就可以获奖(所谓最接近,是指该数字与幸运数之差的绝对值最小)。

但规则如果这么简单就没什么可玩的了…… 我们把规则搞复杂一点:首先创建一个有 n×m 个格子的矩阵,保证格子总数不小于玩家总数,可以把所有玩家下注的数字随机放进格子里,每个格子最多放一个。然后我们随机生成一个幸运行号 r (1≤r≤n)和幸运列号 c (1≤c≤m),再随机生成一个幸运六位数。中奖者是第 r 行和第 c 列的所有六位数中与幸运数最接近的那个数字的主人。

本题就请你写个程序实现这个抽奖功能。

输入格式:

输入第一行给出 2 个正整数 n 和 m(1≤n,m≤1000),随后 n 行,每行给出 m 个数字,对应该位置格子里玩家下注的数字。如果这个格子是空的,就用 −1 表示。最后一行给出幸运行号 r、幸运列号 c 和幸运六位数。同行数字间以空格分隔。

注意:行号从上向下递增,列号从左向右递增,均从 1 开始计数。

输出格式:

按照 (行号:列号) 的格式输出中奖者的位置。如果中奖者不唯一,则按照首先在幸运行中从左到右,然后在幸运列中从上到下的顺序输出,每行输出一位中奖者的位置。注意同一个位置只能输出一次。题目保证至少存在一位中奖者。

输入样例:

4 5
233333 000001 -1 888888 666666
001010 369624 777888 -1 999999
480735 100000 591846 369623 123123
456456 591846 000000 501000 233333
2 3 480735

输出样例:

(2:2)
(3:3)

 思路:先分别遍历给出的行和列 求出最小差值  再分别遍历给出的行和列若等于最小差值则输出最对应坐标, 注意元素值为-1时跳过 以及在遍历列时若有已经在遍历行时输出的坐标就跳过

AC代码

#include <iostream>
#include <cmath>

using namespace std;
#define endl '\n'
const int MAXN = 1e3 + 7;
int arr[MAXN][MAXN], det = 0x3f3f3f3f;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            cin >> arr[i][j];
        }
    }
    int r, c, num;
    cin >> r >> c >> num;
    for (int j = 1; j <= m; j++) {
        if (arr[r][j] != -1) {
            det = min(det, abs(num - arr[r][j]));
        }
    }
    for (int i = 1; i <= n; i++) {
        if (arr[i][c] != -1) {
            det = min(det, abs(num - arr[i][c]));
        }
    }

    for (int j = 1; j <= m; j++) {
        if (arr[r][j] == -1) continue;
        if (abs(num - arr[r][j]) == det) {
            cout << "(" << r << ":" << j << ")" << endl;
        }
    }
    for (int i = 1; i <= n; i++) {
        if (arr[i][c] == -1 || i == r) continue;
        if (abs(num - arr[i][c]) == det) {
            cout << "(" << i << ":" << c << ")" << endl;
        }
    }
    return 0;
}

7-8 521序列

所谓“521 序列”是指将一个原始整数序列 S 中的每个数字分别乘以 5、2、1 后形成的序列,例如 S= { 5, 2, 1 } 时,其对应的 521 序列就是 { 25, 10, 5, 10, 4, 2, 5, 2, 1 } —— 这里我们不要求这个序列一定具有某种顺序,即 521 序列中元素的顺序是可以打乱的。给定 S 后,计算其对应的 521 序列是很简单的。但给定一个 521 序列,恢复其对应的原始序列 S 就略微复杂一点了。本题就请你恢复任意给定的 521 序列的原始序列。

输入格式:

输入第一行给出正整数 N(<105),为 521 序列的长度。随后一行给出 N 个整数,即给定的 521 序列。所有数字的绝对值不超过 105,以空格分隔。

输出格式:

在一行中按照非递增序输出 521 序列对应的原始序列。数字间以 1 个空格分隔,行首尾不得有多余空格。

题目保证原始序列是存在的。

输入样例:

12
1 -5 10 -1 2 4 5 -2 5 25 10 2

输出样例:

5 2 1 -1

 AC代码

#include <iostream>
#include <algorithm>
#include <set>

using namespace std;

multiset<int, greater<>> s;

int main() {
    int N;
    cin >> N;
    for (int i = 0; i < N; ++i) {
        int temp;
        cin >> temp;
        s.insert(temp);
    }
    for (int i = 0; i < N / 3; i++) {
        int temp = *s.begin();
        if (temp > 0) {
            temp /= 5;
        }
        if (i == 0) cout << temp;
        else cout << " " << temp;
        s.erase(s.find(temp));
        s.erase(s.find(2 * temp));
        s.erase(s.find(5 * temp));
    }
    return 0;
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_55664293/article/details/124892176

智能推荐

【史上最易懂】马尔科夫链-蒙特卡洛方法:基于马尔科夫链的采样方法,从概率分布中随机抽取样本,从而得到分布的近似_马尔科夫链期望怎么求-程序员宅基地

文章浏览阅读1.3k次,点赞40次,收藏19次。虽然你不能直接计算每个房间的人数,但通过马尔科夫链的蒙特卡洛方法,你可以从任意状态(房间)开始采样,并最终收敛到目标分布(人数分布)。然后,根据一个规则(假设转移概率是基于房间的人数,人数较多的房间具有较高的转移概率),你随机选择一个相邻的房间作为下一个状态。比如在巨大城堡,里面有很多房间,找到每个房间里的人数分布情况(每个房间被访问的次数),但是你不能一次进入所有的房间并计数。但是,当你重复这个过程很多次时,你会发现你更有可能停留在人数更多的房间,而在人数较少的房间停留的次数较少。_马尔科夫链期望怎么求

linux以root登陆命令,su命令和sudo命令,以及限制root用户登录-程序员宅基地

文章浏览阅读3.9k次。一、su命令su命令用于切换当前用户身份到其他用户身份,变更时须输入所要变更的用户帐号与密码。命令su的格式为:su [-] username1、后面可以跟 ‘-‘ 也可以不跟,普通用户su不加username时就是切换到root用户,当然root用户同样可以su到普通用户。 ‘-‘ 这个字符的作用是,加上后会初始化当前用户的各种环境变量。下面看下加‘-’和不加‘-’的区别:root用户切换到普通..._限制su root登陆

精通VC与Matlab联合编程(六)_精通vc和matlab联合编程 六-程序员宅基地

文章浏览阅读1.2k次。精通VC与Matlab联合编程(六)作者:邓科下载源代码浅析VC与MATLAB联合编程浅析VC与MATLAB联合编程浅析VC与MATLAB联合编程浅析VC与MATLAB联合编程浅析VC与MATLAB联合编程  Matlab C/C++函数库是Matlab扩展功能重要的组成部分,包含了大量的用C/C++语言重新编写的Matlab函数,主要包括初等数学函数、线形代数函数、矩阵操作函数、数值计算函数_精通vc和matlab联合编程 六

Asp.Net MVC2中扩展ModelMetadata的DescriptionAttribute。-程序员宅基地

文章浏览阅读128次。在MVC2中默认并没有实现DescriptionAttribute(虽然可以找到这个属性,通过阅读MVC源码,发现并没有实现方法),这很不方便,特别是我们使用EditorForModel的时候,我们需要对字段进行简要的介绍,下面来扩展这个属性。新建类 DescriptionMetadataProvider然后重写DataAnnotationsModelMetadataPro..._asp.net mvc 模型description

领域模型架构 eShopOnWeb项目分析 上-程序员宅基地

文章浏览阅读1.3k次。一.概述  本篇继续探讨web应用架构,讲基于DDD风格下最初的领域模型架构,不同于DDD风格下CQRS架构,二者架构主要区别是领域层的变化。 架构的演变是从领域模型到C..._eshoponweb

Springboot中使用kafka_springboot kafka-程序员宅基地

文章浏览阅读2.6w次,点赞23次,收藏85次。首先说明,本人之前没用过zookeeper、kafka等,尚硅谷十几个小时的教程实在没有耐心看,现在我也不知道分区、副本之类的概念。用kafka只是听说他比RabbitMQ快,我也是昨天晚上刚使用,下文中若有讲错的地方或者我的理解与它的本质有偏差的地方请包涵。此文背景的环境是windows,linux流程也差不多。 官网下载kafka,选择Binary downloads Apache Kafka 解压在D盘下或者什么地方,注意不要放在桌面等绝对路径太长的地方 打开conf_springboot kafka

随便推点

VS2008+水晶报表 发布后可能无法打印的解决办法_水晶报表 不能打印-程序员宅基地

文章浏览阅读1k次。编好水晶报表代码,用的是ActiveX模式,在本机运行,第一次运行提示安装ActiveX控件,安装后,一切正常,能正常打印,但发布到网站那边运行,可能是一闪而过,连提示安装ActiveX控件也没有,甚至相关的功能图标都不能正常显示,再点"打印图标"也是没反应解决方法是: 1.先下载"PrintControl.cab" http://support.businessobjects.c_水晶报表 不能打印

一. UC/OS-Ⅱ简介_ucos-程序员宅基地

文章浏览阅读1.3k次。绝大部分UC/OS-II的源码是用移植性很强的ANSI C写的。也就是说某产品可以只使用很少几个UC/OS-II调用,而另一个产品则使用了几乎所有UC/OS-II的功能,这样可以减少产品中的UC/OS-II所需的存储器空间(RAM和ROM)。UC/OS-II是为嵌入式应用而设计的,这就意味着,只要用户有固化手段(C编译、连接、下载和固化), UC/OS-II可以嵌入到用户的产品中成为产品的一部分。1998年uC/OS-II,目前的版本uC/OS -II V2.61,2.72。1.UC/OS-Ⅱ简介。_ucos

python自动化运维要学什么,python自动化运维项目_运维学python该学些什么-程序员宅基地

文章浏览阅读614次,点赞22次,收藏11次。大家好,本文将围绕python自动化运维需要掌握的技能展开说明,python自动化运维从入门到精通是一个很多人都想弄明白的事情,想搞清楚python自动化运维快速入门 pdf需要先了解以下几个事情。这篇文章主要介绍了一个有趣的事情,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获,下面让小编带着大家一起了解一下。_运维学python该学些什么

解决IISASP调用XmlHTTP出现msxml3.dll (0x80070005) 拒绝访问的错误-程序员宅基地

文章浏览阅读524次。2019独角兽企业重金招聘Python工程师标准>>> ..._hotfix for msxml 4.0 service pack 2 - kb832414

python和易语言的脚本哪门更实用?_易语言还是python适合辅助-程序员宅基地

文章浏览阅读546次。python和易语言的脚本哪门更实用?_易语言还是python适合辅助

redis watch使用场景_详解redis中的锁以及使用场景-程序员宅基地

文章浏览阅读134次。详解redis中的锁以及使用场景,指令,事务,分布式,命令,时间详解redis中的锁以及使用场景易采站长站,站长之家为您整理了详解redis中的锁以及使用场景的相关内容。分布式锁什么是分布式锁?分布式锁是控制分布式系统之间同步访问共享资源的一种方式。为什么要使用分布式锁?​ 为了保证共享资源的数据一致性。什么场景下使用分布式锁?​ 数据重要且要保证一致性如何实现分布式锁?主要介绍使用redis来实..._redis setnx watch

推荐文章

热门文章

相关标签