AtcoderABC251场

A - Six CharactersA - Six Characters

AtcoderABC251场_第1张图片AtcoderABC251场_第2张图片

题目大意

给定一个由小写英文字母组成的字符串S,S的长度在1到3之间。
打印一个长度为6的字符串,该字符串是S的重复。

思路分析

通过将S重复拼接6次(如果给定原字符串最小的情况),并取前6个字符,我们可以满足题目要求,并得到一个长度为6的字符串。

时间复杂度

O(1)

AC代码

#include
using namespace std;
int main()
{
string s;
cin>>s;
string s1=s+s+s+s+s+s;
cout<<s1.substr(0,6)<<endl;
return 0;
}

B - At Most 3 (Judge ver.)B - At Most 3 (Judge ver.)

AtcoderABC251场_第3张图片AtcoderABC251场_第4张图片

题目大意

有N个重量,第i个重量为Ai。一个正整数n是好整数,如果满足以下条件:

  • 最多可以选择三个不同的重量,使它们的总质量为n。
    求小于等于W的好整数有多少个。

思路分析

通过遍历每个可能的总质量n并计算是否存在一种选择方式,我们可以找到所有小于等于W的好整数的数量。枚举一个相加的,两个相加的,三个相加的总质量,若对应总质量小于等于W,则总质量为好整数,它的flag值标记为true。

时间复杂度

O(N^3 + W)
设N为重量的数量,W为最大总质量。

  • 初始化布尔数组flag的时间复杂度为O(W)。
  • 遍历计算两个和三个重量的总质量的时间复杂度为O(N^3)。
  • 遍历统计flag数组中为true的个数的时间复杂度为O(W)。

AC代码

#include
using namespace std;

int main() {
    int n, w;
    cin >> n >> w;
    
    vector<int> s(n);
    for(int i = 0; i < n; i++) {
        cin >> s[i];
    }
    
    vector<bool> flag(w + 1, false);
    
    for(int i = 0; i < n; i++) {
        for(int j = i + 1; j < n; j++) {
            if(s[i] + s[j] <= w) {
                flag[s[i] + s[j]] = true;
            }
            for(int k = j + 1; k < n; k++) {
                if(s[i] + s[j] + s[k] <= w) {
                    flag[s[i] + s[j] + s[k]] = true;
                }
            }
        }
    }
    
    int ans = 0;
    for(int i = 1; i <= w; i++) {
        if(flag[i]) {
            ans++;
        }
    }
    
    cout << ans << endl;

    return 0;
}

C - Poem Online Judge C - Poem Online Judge

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

题目大意

这道题目是关于 Poem Online Judge(POJ)的在线评测系统。有N次提交到POJ。在第i次最早的提交中,字符串Si被提交,并给出了得分Ti。(相同的字符串可能会被多次提交。)需要找到满足以下条件的最佳提交的索引:
1)该提交是原始提交;
2)该提交具有最高的得分。

思路分析

为了解决这个问题,我们可以使用一个集合 ap 来记录已经出现过的字符串,以判断是否为原始提交。然后,我们遍历每个提交,如果当前字符串已经在 ap 集合中出现过(原始),则跳过继续执行下一次循环。否则,将当前字符串添加到 ap 集合中,并比较得分来确定是否更新最高得分和最佳提交的索引和得分。

时间复杂度

O(N)

AC代码

#include 
#include 
#include 
using namespace std;

int main() {
    int n;
    cin >> n;
    
    vector<string> s(n);
    vector<int> t(n);
    for (int i = 0; i < n; i++) {
        cin >> s[i] >> t[i];
    }
    
    int best = -1;
    int best_score = -1;
    
    set<string> ap;
    for (int i = 0; i < n; i++) {
        if (ap.count(s[i]) > 0) {
            continue;
        }
        ap.insert(s[i]);
        if (best_score < t[i]) {
            best = i;
            best_score = t[i];
        }
    }
    
    cout << best + 1 << endl;
    
    return 0;
}

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