一:L1阶题
L1-1 编程解决一切
#include<bits/stdc++.h>
using namespace std;
int n, m, k, d, x, y;
int main()
{
cout << "Problem? The Solution: Programming." << endl;
return 0;
}
L1-2 再进去几个人
#include<bits/stdc++.h>
using namespace std;
int n, m, k, d, x, y;
int main()
{
cin >> n >> m;
cout << m - n << endl;
return 0;
}
L1-3 帮助色盲
注意:当前方有人但是黄灯时,应该选择"stop"其他情况根据题意模拟即可
#include<bits/stdc++.h>
using namespace std;
int n, m, k, d, x, y;
int main()
{
cin >> n >> m;
if(m)
{
cout << "-" << endl;
if(n == 0)cout << "stop" << endl;
else if(1 == n)cout << "move" << endl;
else cout << "stop" << endl;
}
else
{
if(0 == n)cout << "biii" << endl << "stop" << endl;
else if(1 == n)cout << "dudu" << endl << "move" << endl;
else cout << "-" << endl << "stop" << endl;
}
return 0;
}
L1-4 四项全能
很简单,根据题意说法模拟即可,需注意ans为0的情况即可
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n, m, k, d, x, y;
int ans = 0;
signed main()
{
cin >> n >> m;
for(int i = 1;i <= m;i++)
{
cin >> k;ans += k;
}
cout << max((long long)0, ans - n * (m - 1)) << endl;
return 0;
}
L1-5 别再来这么多猫娘了!
补题:
#include <bits/stdc++.h>
using namespace std;
int n, k, cnt;
string str;
vector<string> limits;
int main() {
cin >> n; cin.get();
for (int i = 1; i <= n; i++) {
getline(cin, str);
limits.push_back(str);
}
cin >> k; cin.get();
getline(cin, str);
//1.禁词可能是“<censored>”的子串 2.违禁词可能是另一个违禁词的子串
for (auto c : limits) {
while (str.find(c) != string::npos) {
str.replace(str.find(c), c.length(), "-");
cnt ++;
}
}
while (str.find("-") != string::npos)
str.replace(str.find("-"), 1, "<censored>");
if (cnt >= k) cout << cnt << "\nHe Xie Ni Quan Jia!\n";
else cout << str << endl;
return 0;
}
L1-6 兰州牛肉面
依旧模拟
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n, m, k, d, x = 1, y;
double ans = 0;
double p[110];
int num[110];
signed main()
{
cin >> n;
for(int i = 1;i <= n;i++)cin >> p[i];
while(x)
{
cin >> x >> y;
num[x] += y;
ans += p[x] * y;
}
for(int i = 1;i <= n;i++)cout << num[i] << endl;
printf("%.2lf",ans);
return 0;
}
L1-7 整数的持续性
还是模拟
#include<bits/stdc++.h>
using namespace std;
int n, m, k, d, x, y;
map<int,int>id;
int mx = 0,sum = 0;
void solve(int x)
{
int fx = x;
string s = to_string(fx);
int t = 0;
while(s.size() > 1)
{
t += 1;
int cnt = 1;
for(auto i : s)
cnt *= (i - '0');
s = to_string(cnt);
}
if(mx < t)
{
mx = t;
sum = 1;
}
else if(mx == t)sum += 1;
id[x] = t;
}
int main()
{
cin.tie(0) -> sync_with_stdio(false);
cin >> n >> m;
for(int i = n; i <= m;i++)
{
solve(i);
}
cout << mx << endl;
for(auto &x : id)
if(x.second == mx)
{
sum -= 1;
cout << x.first;
if(sum)cout << ' ';
}
return 0;
}
L1-8 九宫格
#include<iostream>
#include<algorithm>
#include<vector>
#include<set>
#include<queue>
#include<map>
#include<string>
#include<cmath>
#include<bitset>
#include<sstream>//切割strtream头文件
#include<climits>//INT_MAX文件
#include <utility>
using i64 = int64_t;
using namespace std;
#define int i64
#define endl '\n'
#define AC return 0;
#define WA cout << "SHU_YUAN" << endl;
const int maxn = 1e6 + 10;
int n, m, k, d, T = 1, A, B;
bool isValidSudoku(vector<vector<char>>& board)
{
bool tr[9][10] = { 0 };
bool le[9][10] = { 0 };
bool box[9][10] = { 0 };
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
int num = board[i][j] - '0';
if (tr[i][num])return false;
if (le[j][num])return false;
if (box[i / 3 + j / 3 * 3][num])return false;
tr[i][num] = true;
le[j][num] = true;
box[i / 3 + j / 3 * 3][num] = true;
}
}
return true;
}
void solve()
{
vector<vector<char>> v;
bool is = true;
for(int i = 1;i <= 9;i++)
{
v.emplace_back();
for(int j = 1;j <= 9;j++)
{
int ch;cin >> ch;
if(ch < 1 || ch > 9)is = false;
v.back().emplace_back(ch + '0');
}
}
if(!is)cout << 0 << endl;
else cout << isValidSudoku(v) << endl;
}
signed main() {
cin.tie(0) -> sync_with_stdio(false);
int T = 1;
cin >> T;
while (T--) solve();
return 0;
}
二:L2阶题
L2-1 鱼与熊掌
思路:
1:set的下标表示物品代号,set存放的元素表示有该物品的所有人
2:对于x y,通过对每一个人循环查找得到答案
3:cin输入需要取消流同步
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int maxn = 1e5 + 10;
int n, m, k, d, x = 1, y;
double ans = 0;
set<int>s[maxn];
signed main()
{
cin.tie(0) -> sync_with_stdio(false);
cin >> n >> m;
for(int i = 1;i <= n;i++)
{
cin >> k;
while(k--)
{
cin >> x;
s[x].insert(i);
}
}
cin >> k;
while(k--)
{
cin >> x >> y;
int cnt = 0;
for(int i = 1;i <= n;i++)
if(s[x].find(i) != s[x].end() && s[y].find(i) != s[y].end())cnt += 1;
cout << cnt << endl;
}
return 0;
}
L2-2 懂蛇语
思路:
1:对每一个语句进行简化处理
2:给每一个不同的简化语句int标记
3:查找时通过map查看是否有对于简化语句输出即可
4:使用set存放答案最后一个测试点不通过(原因暂时未知)
#include<iostream>
#include<algorithm>
#include<vector>
#include<set>
#include<queue>
#include<map>
#include<string>
#include<cmath>
#include<bitset>
#include<sstream>//切割strtream头文件
#include<climits>//INT_MAX文件
#include <utility>
using i64 = int64_t;
using namespace std;
#define int i64
#define endl '\n'
#define AC return 0;
#define WA cout << "SHU_YUAN" << endl;
const int maxn = 1e5 + 10;
int n, m, k, d, T = 1, A, B;
string s;
vector<string>S[maxn];
int cnt;
map<string,int>M;
string Tf(string &x)
{
bool is = true;
string t;
for(int i = 0;i < x.size();i++)
{
if(x[i] == ' ')is = true;
if(is && x[i] != ' ')
{
t += x[i];
is = false;
}
}
return t;
}
void solve()
{
cin >> n;getline(cin, s);
for(int i = 1;i <= n; i++)
{
getline(cin, s);
string t = Tf(s);
if(M.find(t) == M.end())
{
M[t] = ++cnt;
S[cnt].emplace_back(s);
}
else S[M[t]].emplace_back(s);
}
cin >> m;getline(cin, s);
for(int i = 0;i <= cnt;i++)sort(S[i].begin(),S[i].end());
for(int i = 1;i <= m;i++)
{
getline(cin, s);
string t = Tf(s);
if(M.find(t) == M.end())cout << s << endl;
else
{
int p = S[M[t]].size();
for(auto &i : S[M[t]])
{
cout << i;
p--;if(p >= 1)cout << '|';
}
cout << endl;
}
}
}
signed main() {
cin.tie(0) -> sync_with_stdio(false);
int T = 1;
while (T--) solve();
return 0;
}
L2-3 满树的遍历
思路:树的先序遍历,只需要判断非叶子结点的度和根的度是否一致即可
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
int n, m, k, d, T = 1, mx;
vector<int>v[maxn], ans;
bool is = true;
void pre_f(int x)
{
if(v[x].empty())return;
sort(v[x].begin(),v[x].end());
if(x && v[x].size() != mx)is = false;
for(int i = 0;i < v[x].size();i++)
{
ans.emplace_back(v[x][i]);
pre_f(v[x][i]);
}
}
void solve()
{
cin >> n;
for(int i = 1;i <= n;i += 1)
{
cin >> m;
v[m].emplace_back(i);
}
mx = v[v[0][0]].size();
pre_f(0);
cout << mx << (is ? " yes" : " no") << endl;
for(int i = 0;i < n;i++)
cout << ans[i] << (i == n - 1 ? '\n' : ' ');
}
signed main() {
cin.tie(0) -> sync_with_stdio(false);
while (T--) solve();
return 0;
}
L2-4 吉利矩阵
dfs剪枝
#include<iostream>
#include<algorithm>
#include<vector>
#include<set>
#include<queue>
#include<map>
#include<string>
#include<cmath>
#include<bitset>
#include<sstream>//切割strtream头文件
#include<climits>//INT_MAX文件
#include <utility>
using i64 = int64_t;
using namespace std;
#define int i64
#define endl '\n'
#define AC return 0;
#define WA cout << "SHU_YUAN" << endl;
const int maxn = 1e6 + 10;
int n, m, k, d, T = 1, A, B, l, ans;
int lx[15], ly[15];
void solve(int x, int y)
{
if(x == n + 1)
{
ans += 1;return;
}
for(int i = 0;i <= l - max(lx[x], ly[y]); i++)
{
lx[x] += i;ly[y] += i;
if(y < n) solve(x, y + 1);
else if(y == n && lx[x] == l)solve(x + 1, 1);
lx[x] -= i;ly[y] -= i;
}
}
signed main() {
cin.tie(0) -> sync_with_stdio(false);
cin >> l >> n;
solve(1, 1);
cout << ans << endl;
return 0;
}
三:L3阶题
L3-1 夺宝大赛
思路:从大本营BFS到每一个可达距离,找到唯一最短单位时间的队伍即可
#include<bits/stdc++.h>
using namespace std;
int n, m, k, d, x, y;
int a[110][110];
bool is[110][110];
bool vis[110][110];
int dx[] = {1, -1, 0, 0};
int dy[] = {0, 0, 1, -1};
map<pair<int,int>,int>id;
struct Node
{
int x, y;
int step;
Node(int a, int b, int c) {x = a, y = b, step = c;}
};
vector<Node>ans;
void Bfs()
{
queue<Node>Q;
Q.emplace(Node{x, y, 0});
vis[x][y] = true;
while(!Q.empty())
{
auto now = Q.front();
Q.pop();
for(int i = 0;i < 4;i++)
{
int tx = now.x + dx[i];
int ty = now.y + dy[i];
if(1 <= tx && tx <= n && 1 <= ty && ty <= m && !vis[tx][ty] && a[tx][ty])
{
vis[tx][ty] = true;
if(is[tx][ty])ans.emplace_back(Node{tx, ty, now.step + 1});
Q.emplace(Node{tx, ty, now.step + 1});
}
}
}
}
int main()
{
cin >> n >> m;
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= m;j++)
{
cin >> a[i][j];
if(2 == a[i][j])x = i, y = j;
}
}
cin >> k;
for(int i = 1;i <= k;i++)
{
int tx = 0, ty = 0;
cin >> ty >> tx; is[tx][ty] = true;
id[make_pair(tx, ty)] = i;
}
Bfs();
sort(ans.begin(),ans.end(),[&](auto x, auto y)
{
return x.step < y.step;
});
ans.insert(ans.begin(), Node{0, 0,-1});
ans.emplace_back(Node{0, 0,-1});
for(int i = 1;i <= ans.size() - 2;i++)
{
if(ans[i].step != ans[i - 1].step && ans[i].step != ans[i + 1].step)
{
cout << id[make_pair(ans[i].x, ans[i].y)] << ' ' << ans[i].step << endl;
return 0;
}
}
cout << "No winner." << endl;
return 0;
}