竞赛地址:CSDN编程竞赛 周赛第26期
目录
前言
本期竞赛的四道题目难度都不高,我这种刚步入C/C++的小白都有幸获得奖品。
接下来分享一下本期题目的题解,如有问题,欢迎提出。
1、等差数列
一个等差数列是一个能表示成a, a+b, a+2b,..., a+nb (n=0,1,2,3,...)的数列。在这个问题中a是一个非负的整数,b是 正整数。 现给出三个整数,分别表示等差数列的第一项a、最后一项、公差b,求该数列的和。
思路:等差数列是中学知识,已知首项、末项和公差,求前n项的和,等差数列求和公式及变式有多种,先求出项数会方便许多。
#include <iostream> using namespace std; int main() { int a, an, b; cin >> a >> an >> b; if ((an - a) % b == 0) { int s; //s为前n项和 s = (a + an) * ((an - a) / b + 1) / 2; //(首项+末项)*项数/2 cout << s << endl; } else cout << "-1" << endl; return 0; }
2、阿波罗的魔力宝石
在希腊神话中,有一个神祗阿波罗。阿波罗拥有一枚能够使人变得更加聪明的神奇宝石。但是,这枚宝石的魔力被封印在 了一个混乱的顺序中,你需要通过排序的方法才能拥有这枚宝石的魔力。 给定一个长度为 N 的整数数组 A,请你将数组 A中的元素进行冒泡排序。(该题目由CSDN用户【生产队的刘同学】提供)
思路:考察冒泡排序,如果偷懒用set容器也能通过90%测试用例。
#include <iostream> #include <set> using namespace std; int main() { int n, temp; cin >> n; int box[100010]; for (int i = 0; i < n; i++) { cin >> box[i]; } for (int i = 0; i < n - 1; i++) //冒泡排序 { for (int j = 0; j < n - 1 - i; j++) { if (box[j] > box[j + 1]) { temp = box[j]; box[j] = box[j + 1]; box[j + 1] = temp; } } } for (int i = 0; i < n; i++) { cout << box[i] << endl; } return 0; }
3、任务分配问题
小明手头上有n个问题,每个问题都有一个数值,表示这个问题的难度;正好小明团队有n个人,每个人都有一个数值,表 示这个人的能力。现在小明要把这n个问题分配给每个人,要求能力更高的人分配到更高难度的问题。
思路:能力高的分配难度高的问题,难点是存在能力大小相同的人,因此需要记录每个人的出现顺序。
#include <iostream> #include <vector> #include <algorithm> using namespace std; class person //记录每个人的出现顺序和能力 { public: int num; int powers; }; bool cmp(person a, person b) { if (a.powers != b.powers) { return a.powers < b.powers; } return a.num > b.num; } int main() { int n, temp; cin >> n; vector<int> box; vector<person> per; //记录出现顺序 vector<person> perper; //按照出现顺序和能力大小排序 for (int i = 0; i < n; i++) { cin >> temp; box.push_back(temp); } sort(box.begin(), box.end()); person per_temp; for (int i = 1; i <= n; i++) { cin >> per_temp.powers; per_temp.num = i; perper.push_back(per_temp); } per = perper; sort(per.begin(), per.end(), cmp); for (int i = 0; i < n; i++) { //按照出现顺序输出对应的问题 for (int j = 0; j < n; j++) { if (perper[i].powers == per[j].powers && perper[i].num == per[j].num) { cout << box[j] << endl; break; } } } return 0; }
4、单词逆序
对于一个字符串,请设计一个算法,只在字符串的单词间做逆序调整,也就是说,字符串由一些由空格分隔的部分组成, 你需要将这些部分逆序。 给定一个原字符串A,请返回逆序后的字符串。例,输入”It’s a dog!“输出”dog! a It’s“。
思路:按顺序记录每个单词,再倒序输出。
#include <iostream> #include <string> #include <vector> #include <algorithm> using namespace std; int main() { string str, temp; getline(cin, str); //记录给定的字符串 vector<string> box; //记录每个单词 int i, j; for (i = 0; i < str.size(); i++) { if (str[i] != ' ') { temp += str[i]; } else if (str[i] == ' ') { //遇到空格,结束一个单词 box.push_back(temp); temp.clear(); } if (i == str.size() - 1) { //如果是最后一个字符,也需要结束一个单词 box.push_back(temp); } } for (i = box.size() - 1; i >= 0; i--) //倒序输出 { cout << box[i]; if (i != 0) printf(" "); else cout << endl; } return 0; }