A - September
题意
给\(12\)个字符串,问长度等于标号的字符串个数。
思路
模拟。
代码
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mxn = 1e6 + 5;
void solve()
{
int ans = 0;
for (int i = 0; i < 12; i++)
{
string s;
cin >> s;
if (s.size() == i + 1)
{
ans++;
}
}
cout << ans << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int T = 1;
//cin >> T;
while (T--)
{
solve();
}
return 0;
}
B - 1D Keyboard
题意
给从\(A\)到\(Z\)的\(26\)个英文字母,从\(A\)开始,一次走\(1\)步,每个字母都要走到,问走到\(Z\)要几步。
思路
模拟。
代码
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve()
{
string s;
cin >> s;
vector<int> v(26);
for (int i = 0; i < s.size(); i++)
{
v[s[i] - 'A'] = i;
}
int ans = 0;
for (int i = 1; i < 26; i++)
{
ans += abs(v[i] - v[i - 1]);
}
cout << ans << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int T = 1;
//cin >> T;
while (T--)
{
solve();
}
return 0;
}
C - Max Ai+Bj
题意
两个长度为\(n\)的序列,找出\(A_i+B_j\)的最大值。
思路
两个序列各自的最大值之和就是答案。
代码
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve()
{
int n, x, maxn1 = LLONG_MIN, maxn2 = LLONG_MIN;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> x;
maxn1 = max(maxn1, x);
}
for (int i = 0; i < n; i++)
{
cin >> x;
maxn2 = max(maxn2, x);
}
cout << maxn1 + maxn2 << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int T = 1;
//cin >> T;
while (T--)
{
solve();
}
return 0;
}
D - Hidden Weights
题意
给\(n\)个点,\(m\)条边及其边权\(w\),给每个点赋权\(x\),使得\(x_{v_j} - x_{u_j} = w_j\),题目保证有解。
思路
从任意一个顶点开始赋值,然后使用\(dfs\)遍历其所有邻点,计算每个顶点的值\(x_{v_j} = x_{u_j} + w_j\)。
代码
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mxn = 1e6 + 5;
int idx;
int to[mxn], nxt[mxn], head[mxn], edge[mxn], ans[mxn];
bool vis[mxn];
void add(int u, int v, int w)
{
to[++idx] = v;
edge[idx] = w;
nxt[idx] = head[u];
head[u] = idx;
}
void dfs(int u, int val)
{
vis[u] = true;
ans[u] = val;
for (int i = head[u]; i; i = nxt[i])
{
int v = to[i];
if (!vis[v])
{
dfs(v, val + edge[i]); // val_v - val_u = edge[i]
}
}
}
void solve()
{
int n, m;
cin >> n >> m;
for (int i = 0; i < m; i++)
{
int u, v, w;
cin >> u >> v >> w;
u--, v--;
add(u, v, w);
add(v, u, -w); // 反向边
}
for (int i = 0; i < n; i++) // 遍历所有点,防止不连通
{
if (!vis[i])
{
dfs(i, 0);
}
}
for (int i = 0; i < n; i++)
{
cout << ans[i] << " ";
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int T = 1;
while (T--)
{
solve();
}
return 0;
}
E - How to Win the Election
题意
思路
代码
点击查看代码
F -
题意
思路
代码
点击查看代码
G -
题意
思路
代码
点击查看代码