A - Six CharactersA - Six Characters
题目大意
给定一个由小写英文字母组成的字符串S,S的长度在1到3之间。
打印一个长度为6的字符串,该字符串是S的重复。
思路分析
通过将S重复拼接6次(如果给定原字符串最小的情况),并取前6个字符,我们可以满足题目要求,并得到一个长度为6的字符串。
时间复杂度
O(1)
AC代码
#include<bits/stdc++.h>
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.)
题目大意
有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<bits/stdc++.h>
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
题目大意
这道题目是关于 Poem Online Judge(POJ)的在线评测系统。有N次提交到POJ。在第i次最早的提交中,字符串Si被提交,并给出了得分Ti。(相同的字符串可能会被多次提交。)需要找到满足以下条件的最佳提交的索引:
1)该提交是原始提交;
2)该提交具有最高的得分。
思路分析
为了解决这个问题,我们可以使用一个集合 ap 来记录已经出现过的字符串,以判断是否为原始提交。然后,我们遍历每个提交,如果当前字符串已经在 ap 集合中出现过(原始),则跳过继续执行下一次循环。否则,将当前字符串添加到 ap 集合中,并比较得分来确定是否更新最高得分和最佳提交的索引和得分。
时间复杂度
O(N)
AC代码
#include <iostream>
#include <vector>
#include <set>
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;
}