本次AcWing周赛主要还是要考察细节,难度不大。
A题
题目链接
题解
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n, k;
cin >> n >> k;
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
sort(a.begin(), a.end());
cout << a[n - k] << endl;
return 0;
}
复杂度分析
快排,时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)。
B题
题目链接
题解
将各种情况考虑清楚即可。
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int flag = 0;
int ans = 0;
int sum = 0;
for (int i = 0; i < n; i++) {
char c;
cin >> c;
if (c == '.') sum++;
else {
if (flag == 0 && c == 'L') {
sum = 0;
flag = -1;
} else if (flag == 0 && c == 'R') {
ans += sum;
sum = 0;
flag = 1;
} else if (flag == -1 && c == 'R') {
ans += sum;
sum = 0;
flag = 1;
} else if (flag == 1 && c == 'L') {
ans += sum % 2;
sum = 0;
flag = -1;
}
}
}
if (flag == 1) sum = 0;
cout << ans + sum << endl;
return 0;
}
复杂度分析
读入同时进行处理即可,时间复杂度为 O ( n ) O(n) O(n)。
C题
题目链接
题解
根据题意,0必须单独,1最多可以存在两个,共有n个0和m个1,因而可以推出只有满足
n - 1
≤
\leq
≤ m
≤
\leq
≤ 2
×
\times
× (n + 1)
才能构造出满足规则的序列。
#include <iostream>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
if (m < n - 1 || m > 2 * (n + 1)) cout << -1 << endl;
else {
string s = "";
if (n > m) s += "0";
while (m > n && n) {
s += "110";
m -= 2;
n -= 1;
}
while (m && n) {
s += "10";
m--;
n--;
}
for (int i = 0; i < m; i++) {
s += "1";
}
cout << s << endl;
}
return 0;
}
复杂度分析
明显可以 O ( n ) O(n) O(n)的时间复杂度完成构造。