AtcoderABC260场

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 
#include 
using namespace std;

int main()
{
    string s;
    cin >> s;

    unordered_map 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!

AtcoderABC260场_第1张图片AtcoderABC260场_第2张图片AtcoderABC260场_第3张图片AtcoderABC260场_第4张图片

题目大意

有n个学生参加了数学和英语两门考试,每个学生的分数都已经给定。现在需要按照一定规则对学生进行排序,并输出排名前a+b+c名学生的编号。

思路分析

根据题目要求,需要按照以下规则对学生进行排序:
首先按照数学成绩降序排序,如果数学成绩相同,则根据英语成绩降序排序。
排名前a名的学生按照英语成绩降序排序,如果英语成绩相同,则根据数学成绩降序排序。
排名前a+b名的学生按照数学和英语成绩之和降序排序,如果总分相同,则根据学生编号升序排序。
根据以上规则,首先读入学生的成绩数据并存储到一个结构体数组中。然后使用sort函数进行排序,依次按照上述规则进行比较。最后输出排名前a+b+c名学生的编号即可。

时间复杂度

O(nlogn)

代码

#include 
#include 
#include 
using namespace std;

struct SC {
    pair 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 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

AtcoderABC260场_第5张图片AtcoderABC260场_第6张图片AtcoderABC260场_第7张图片

题目大意

求解从一种宝石到另一种宝石的转换过程中,获得等级为1的蓝宝石的最大数量。给定宝石的等级N、转换系数X和Y,其中红宝石可以转换成蓝宝石,蓝宝石也可以转换成蓝宝石。

思路分析

解题思路分为两部分:动态规划和递归函数。

  • 动态规划:通过定义r和b数组,分别表示从红宝石和蓝宝石开始能获得等级为1的蓝宝石的最大数量。首先确定r1和b1的初始值,然后根据递推关系式计算出r[i]和b[i]的值。最终结果存储在r[N]中。

  • 递归函数:通过定义calc函数,使用递归的方式计算从某个等级的宝石开始能够获得的等级为1的蓝宝石的最大数量。递归函数根据宝石的颜色和等级进行条件判断和递归调用,直到达到等级为1时返回相应的值。

时间复杂度

动态规划方法:O(N)
递归方法:O(2N)

代码

#include 
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;
}

你可能感兴趣的:(算法)