A. Telephone Number
思路:字符串长度小于11或长度为11时首位不为8或长度>11且第一个8的位置不<=n-11的情况都为No
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 3e5 + 5;
int main() {
ios::sync_with_stdio(false);
int T;
cin >> T;
while(T--) {
int n;
cin >> n;
string str;
cin >> str;
if(n < 11)
cout << "NO" << endl;
else if(n == 11) {
if(str[0] == '8')
cout << "YES" << endl;
else
cout << "NO" << endl;
} else {
int x = str.size();
for(int i = 0; i < str.size(); i += 1) {
if(str[i] == '8') {
x = i;
break;
}
}
if(x <= n - 11)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
}
return 0;
}
B. Lost Numbers
按题目的意思写?
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> p = {4, 8, 15, 16, 23, 42};
int query[4];
int main() {
for(int i = 0; i < 4; i += 1) {
cout << "? " << i + 1 << ' ' << i + 2 << endl;
cout.flush();
cin >> query[i];
}
do {
bool yes = true;
for(int i = 0; i < 4; i += 1) {
if(p[i]*p[i + 1] != query[i]) {
yes = false;
break;
}
}
if(yes)
break;
} while(next_permutation(p.begin(), p.end()));
cout << "!";
for(int i = 0; i < 6; i += 1)
cout << ' ' << p[i];
cout << '\n';
cout.flush();
return 0;
}
C. News Distribution
并查集基础题
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 5e5 + 5;
int fa[N], _rank[N], p[N];
int find(int x) {
if(x == fa[x])
return x;
else
return fa[x] = find(fa[x]);
}
void Merge(int x, int y) {
int u = find(x);
int v = find(y);
if(u != v) {
fa[v] = u;
_rank[u] += _rank[v];
_rank[v] = 0;
}
}
void init(int n) {
for(int i = 1; i <= n; i += 1) {
fa[i] = i;
_rank[i] = 1;
}
}
int main() {
int n, group;
scanf("%d%d", &n, &group);
init(n);
while(group--) {
int k;
scanf("%d", &k);
for(int i = 0; i < k; i += 1) {
scanf("%d", &p[i]);
Merge(p[0], p[i]);
}
}
for(int i = 1; i <= n; i += 1)
printf("%d%c", _rank[find(i)], i < n ? ' ' : '\n');
return 0;
}
D. Bicolored RBS
思路:以相邻的()进行轮流01染色直到染完即可
#include<bits/stdc++.h>
using namespace std;
int main() {
int n;
string str;
cin >> n >> str;
stack<int> s;
vector<int> v(n);
v[0] = 0;
s.push(0);
for(int i = 1; i < n; ++i) {
if(str[i] == '(') {
if(s.empty()) {
s.push(0);
v[i] = 0;
} else {
int x = s.top();
s.push(x ^ 1);
v[i] = (x ^ 1);
}
} else {
int x = s.top();
v[i] = x;
s.pop();
}
}
for(auto i : v)
cout << i;
cout << endl;
return 0;
}
本文精选了四道算法竞赛题目,包括电话号码合法性判断、丢失数字查找、新闻分发问题和双色RBS染色问题的解决方案。通过C++代码详细解析了每道题目的解题思路和实现细节。
1291

被折叠的 条评论
为什么被折叠?



