第一次打周赛,感觉有点简单,可是翻前面几次,好像又不简单了qwq
T1
第一眼还以为啥博弈论,刚准备弃坑走人,突然发现其实是一个简单的比大小……
依题意,每个小朋友的最佳策略肯定是每次拿一个。
又因为是第一个小朋友先手,谁先拿完谁输,
所以可以得出:
- 当 n1>n2 时,第一个小朋友获胜
- 否则第二个小朋友获胜
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n1, n2, k1, k2;
cin >> n1 >> n2 >> k1 >> k2;
if (n1 > n2) cout << "First";
else cout << "Second";
}
T2
第二题应该属于一个比较简单的贪心。
首先,至少有 k 张卡牌正面朝上,翻译过来就是最多可以翻 n−k。
而要求的是最小值,所以我们应该翻 ai−bi 最大的卡牌。
但是,若 ai−bi 为负数,那么翻了会得到更差的结果,所以加一个判断就行啦!
代码:
#include <bits/stdc++.h>
using namespace std;
int n, m, k, sum;
const int N = 200005;
int a[N], b[N], dc[N];
int main()
{
scanf("%d%d", &n, &k);
m = n - k;
for (int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
sum += a[i];
}
for (int i = 1; i <= n; i++)
{
scanf("%d", &b[i]);
dc[i] = a[i] - b[i];
}
sort(dc + 1, dc + 1 + n, greater<int>());
for (int i = 1; i <= m; i++)
if (dc[i] > 0) sum -= dc[i];
printf("%d\n", sum);
}
T3
这道题出乎我意料的简单。
我们可以把每个字符串 fi 的子串全部枚举一遍,统计一遍就行了。
统计的话可以 hash 或者 trie,但是还不如直接用 STL 里的 ‘unordered_map’ 做。
但是有个细节很容易错,就是字符串里若有两个子串相同,那么只算一个,这里可以再开一个容器统计。
代码:
#include <bits/stdc++.h>
using namespace std;
unordered_map<string, string> rst;
unordered_map<string, int> rnum;
unordered_map<string, bool> rge;
int n, q;
string st, fst;
int main()
{
ios::sync_with_stdio(false);
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> st;
rge.clear();
for (int j = 0; j < st.size(); j++)
{
fst = "";
for (int k = j; k < st.size(); k++)
{
fst += st[k];
if (rge[fst]) continue;
rnum[fst]++;
rst[fst] = st;
rge[fst] = 1;
}
}
}
cin >> q;
while (q--)
{
cin >> st;
if (rnum[st] > 0) cout << rnum[st] << ' ' << rst[st] << '\n';
else cout << rnum[st] << " -\n";
}
return 0;
}
萌新刚学不久 不喜勿喷。