A - A Unique LetterA - A Unique Letter
Problem Statement
You are given a string S of length 3.
Print a character that occurs only once in S.
If there is no such character, print -1 instead.
Constraints
S is a string of length 3 consisting of lowercase English letters.
Input
Input is given from Standard Input in the following format:
S
Output
Print the answer. If multiple solutions exist, you may print any of them.
Sample Input 1
pop
Sample Output 1
o
(o occurs only once in pop.)
题目大意
题目要求给定一个长度为3的字符串S,找出其中只出现一次的字符并输出。如果没有出现一次的字符,则输出-1。
思路分析
可以使用哈希表来统计字符串中每个字符出现的次数。然后遍历哈希表,找出只出现一次的字符即可。
时间复杂度
O(n + m)
代码
#include <iostream>
#include <unordered_map>
using namespace std;
int main()
{
string s;
cin >> s;
unordered_map<char, int> count;
for (char c : s) {
count[c]++;
}
bool found = false;
for (auto it : count) {
if (it.second == 1) {
cout << it.first << endl;
found = true;
break;
}
}
if (!found) {
cout << -1 << endl;
}
return 0;
}
B - Better Students Are NeededB - Better Students Are Needed!
题目大意
有n个学生参加了数学和英语两门考试,每个学生的分数都已经给定。现在需要按照一定规则对学生进行排序,并输出排名前a+b+c名学生的编号。
思路分析
根据题目要求,需要按照以下规则对学生进行排序:
首先按照数学成绩降序排序,如果数学成绩相同,则根据英语成绩降序排序。
排名前a名的学生按照英语成绩降序排序,如果英语成绩相同,则根据数学成绩降序排序。
排名前a+b名的学生按照数学和英语成绩之和降序排序,如果总分相同,则根据学生编号升序排序。
根据以上规则,首先读入学生的成绩数据并存储到一个结构体数组中。然后使用sort函数进行排序,依次按照上述规则进行比较。最后输出排名前a+b+c名学生的编号即可。
时间复杂度
O(nlogn)
代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct SC {
pair<int, int> F;
int S;
};
bool cmp1(SC a, SC b) {
if (a.F.first != b.F.first) return a.F.first > b.F.first;
return a.S < b.S;
}
bool cmp2(SC a, SC b) {
if (a.F.second != b.F.second) return a.F.second > b.F.second;
return a.S < b.S;
}
bool cmp3(SC a, SC b) {
if (a.F.first + a.F.second != b.F.first + b.F.second) return a.F.first + a.F.second > b.F.first + b.F.second;
return a.S < b.S;
}
bool cmp4(SC a, SC b) {
return a.S < b.S;
}
void run() {
int n, a, b, c;
cin >> n >> a >> b >> c;
vector<SC> v(n);
for (int i = 0; i < n; i++) {
cin >> v[i].F.first;
}
for (int i = 0; i < n; i++) {
cin >> v[i].F.second;
}
for (int i = 0; i < n; i++) {
v[i].S = i;
}
sort(v.begin(), v.end(), cmp1);
sort(v.begin() + a, v.end(), cmp2);
sort(v.begin() + a + b, v.end(), cmp3);
sort(v.begin(), v.begin() + a + b + c, cmp4);
for (int i = 0; i < a + b + c; i++) {
cout << v[i].S + 1 << endl;
}
}
int main() {
run();
return 0;
}
C - Changing JewelsC - Changing Jewels
题目大意
求解从一种宝石到另一种宝石的转换过程中,获得等级为1的蓝宝石的最大数量。给定宝石的等级N、转换系数X和Y,其中红宝石可以转换成蓝宝石,蓝宝石也可以转换成蓝宝石。
思路分析
解题思路分为两部分:动态规划和递归函数。
-
动态规划:通过定义r和b数组,分别表示从红宝石和蓝宝石开始能获得等级为1的蓝宝石的最大数量。首先确定r1和b1的初始值,然后根据递推关系式计算出r[i]和b[i]的值。最终结果存储在r[N]中。
-
递归函数:通过定义calc函数,使用递归的方式计算从某个等级的宝石开始能够获得的等级为1的蓝宝石的最大数量。递归函数根据宝石的颜色和等级进行条件判断和递归调用,直到达到等级为1时返回相应的值。
时间复杂度
动态规划方法:O(N)
递归方法:O(2N)
代码
#include <iostream>
using namespace std;
long long N, X, Y, r[12], b[12];
// 动态规划
void dynamicProgramming() {
r[1] = 0;
b[1] = 1;
for (int n = 2; n <= N; n++) {
b[n] = r[n - 1] + b[n - 1] * Y;
r[n] = r[n - 1] + b[n] * X;
}
cout << r[N] << "\n";
}
// 递归函数
long long calc(int level, bool is_red) {
if (level == 1) return is_red ? 0 : 1;
if (is_red) {
return calc(level - 1, true) + calc(level, false) * X;
} else {
return calc(level - 1, true) + calc(level - 1, false) * Y;
}
}
int main() {
cin >> N >> X >> Y;
// 使用动态规划求解
dynamicProgramming();
// 使用递归函数求解
// cout << calc(N, true) << endl;
return 0;
}