总结:
按这个出题的风格,历年的题应该没啥常考价值了,没有模板体,都得靠平时编码积累。
一、Prime Day
1、题意:给你一个日期字符串,判断字符串及其后缀字符串所对应的数字是否是一个素数。
如果全是素数的话还要输出一个 All Prime!,还有一个测试样例忘记了。
思路:就是利用stoi()和 substr()可以几分钟直接过了这题。
Input Sample
20191231
Output Sample
20191231 Yes
0191231 Yes
191231 Yes
91231 No
1231 Yes
231 No
31 Yes
1 No
#include<bits/stdc++.h>
using namespace std;
bool isprime(int x) {
if (x < 2) return false;
for (int i = 2; i*i <= x; i++) {
if (x%i == 0) return false;
}
return true;
}
int main() {
#ifdef ONLINE_JUDGE
#else
freopen("Text.txt", "r", stdin);
#endif // DEBUG
string str;
cin >> str;
long long num;
int len = str.length();
int flag = 1;
for (int i = 0; i < len; i++) {
string s = str.substr(i, len - i);
printf("%s ", s.c_str());
num = stoi(s);
if (isprime(num)) {
printf("Yes\n");
}
else {
printf("No\n");
flag = 0;
}
}
if (flag == 1) {
printf("All Prime!");
}
}
二、The Judger
2、一道模拟题,就是玩一个游戏
一开始给出两个数,一共有n 个人,共m 个回合。在每一个回合中,由轮到的玩家给出一个数,如果这个数在之前已经给出了,或者这个数不能由先前的两个数相减得出那么这个玩家就出局,并且出局的玩家之后给出的数据都会被忽略。输出那一轮那些玩家出局,最后输出所有的胜利者。
思路:两个unordered_set s,ans;s来存已经输入的元素,ans来存所有可以得到的差。
Input Sample
42 101
4 5
59 34 67 9 7
17 9 18 50 49
25 92 58 1 39
102 32 2 6 41
Output Sample
Round #1: 4 is out.
Round #3: 2 is out.
Round #4: 1 is out.
Round #5: 3 is out.
No winner.
还有一个可以输出胜利者的测试样例忘记了。
#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
using namespace std;
unordered_set<int> s,ans;
int A[12][1009];
int N, M;
bool visited[15];
int main() {
#ifdef ONLINE_JUDGE
#else
freopen("Text.txt", "r", stdin);
#endif // DEBUG
int num1, num2,sum=0;
scanf("%d %d", &num1, &num2);
int diff = abs(num1-num2);//记录其差值
ans.insert(diff);
s.insert(num1); s.insert(num2);
cin >> N >> M;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
scanf("%d", &A[i][j]);
}
}
for (int i = 1; i <= M; i++) {
for (int j = 1; j <= N; j++) {
if (visited[j] == true) continue;
//表示以及存在这个数字了,或者给出了错误的数字(不能由先前给出的两个数字求差得出)
if (s.find(A[j][i])!=s.end() || ans.find(A[j][i])==ans.end()) {
visited[j] = true;//踢出去
printf("Round #%d: %d is out.\n",i,j);
sum++;//记录胜利者,若为0就表示没有胜利者
continue;
}
s.insert(A[j][i]);
//每进来一个元素跟新s和ans;
for (auto it = s.begin(); it != s.end(); it++) {
ans.insert(abs((*it) - A[j][i]));
}
}
}
if (sum == N) {
printf("No winner.");
return 0;
}
else {
printf("Winner(s):");
for (int i = 1; i <= N; i++) {
if (visited[i] == false) printf(" %d", i);
}
}
}
三、Safari Park
3、水题,就是动物园里面相邻近的笼子不能放相同的动物,可能是观光者周围要出现不同的动物,按照测试样例来讲一讲。
先给出N,M,K;N表示所有的笼子数量,M表示各笼子之间的连接关系,K表示你一共要放多少动物。然后输入各笼子之间的连接关系(一共M行),可以理解为图的边吧,(其实这也不算图的题)。
再输入一个数T;表示接下来有T个放置方案,你需要来判断结果:
1、如果放置的动物数小于K 输出:Error: Too few species.
2、如果放置的动物数大于K 输出:Error: Too many species.
3、如果放置的动物数等于K :
- 若出现相邻的笼子放了相同的动物就输出No;
- 若未出现相邻的笼子放了相同的动物就输出Yes;
思路:领接表存储这个图,然后判断相邻节点之间有没有相同的动物
Input Sample
6 8 3
2 1
1 3
4 6
2 5
2 4
5 4
5 6
3 6
5
1 2 3 3 1 2
1 2 3 4 5 6
4 5 6 6 4 5
2 3 4 2 3 4
2 2 2 2 2 2
Output Sample
Yes
Error: Too many species.
Yes
No
Error: Too few species.
#include<bits/stdc++.h>
#include<unordered_map>
using namespace std;
vector<int> G[509];
unordered_map<int, bool> mp;
int ani[509];
int main() {
#ifdef ONLINE_JUDGE
#else
freopen("Text.txt", "r", stdin);
#endif // DEBUG
int N, M, K;
cin >> N >> M >> K;
for (int i = 0; i < M; i++) {
int u, v;
cin >> u >> v;
G[u].push_back(v);
G[v].push_back(u);
}
int num; cin >> num;
for (int j = 0; j < num; j++) {
int sum = 0;
for (int i = 1; i <= N; i++) {
cin >> ani[i];
if (mp[ani[i]] == false) {
sum++;
mp[ani[i]] = true;
}
}
mp.clear();
if (sum > K) {
cout << "Error: Too many species." << endl;
continue;
}
if (sum < K) {
cout << "Error: Too few species." << endl;
continue;
}
int flag = 1;
for (int i = 1; i <= N; i++) {
int len = G[i].size();
for (int k = 0; k < len; k++) {
if (ani[G[i][k]] == ani[i]) {
flag = 0;
break;
}
}
}
if (flag == 1) cout << "Yes" << endl;
else cout << "No" << endl;
}
}
四、Replace Selection
4、模拟 Replace Selection Sort 的过程,就是说内存不够大只能一次排几个数balabala
好长的英文题,好长好长,不过看看例子就懂了,输入N(数组的长度,输入的元素个数)。K表示一次最多可以排序的个数。
我模拟模拟这个过程:
一开始内存中肯定只有 81 94 11
三个数 排序后就是 11 81 94
然后和数组中的下一个数字进行比较,也就是99,进行比较发现99大于11,所以99和11一个梯队,并从内存中清除11,并将11加入第一梯队,并将99加进去……
过程写的有点着急,字有点丑,大家凑合凑合。
思路:有用优先队列的,有用vector的,有用set的。不过vector+sort肯定会超时,当然也可以对sort优化,这道题我最后一个测试点没过55555。留下菜比的眼泪,最好还是用自带排序的容器吧,避免超时。我就是个渣渣,肯定有大佬的思路比我好的多的。
大概就是用两个set来存放当前内存的第一梯队元素和第二梯队元素,然后第一梯队元素输出完了之后就令第二梯队为新的第一梯队,再将第二梯队clear()又能开始存储新的第二梯队元素了。我的渣渣思路,大家就当笑话看吧,最后一个测试点没过。
Input Sample
13 3
81 94 11 96 12 99 17 35 28 58 41 75 15
Output Sample
11 81 94 96 99
12 17 28 35 41 58 75
15
#include<bits/stdc++.h>
using namespace std;
set<int> run, last;
vector<int> v;// , run, last;
const int INF = 0x7fffffff;
vector<int> ans[100000];
int main() {
#ifdef ONLINE_JUDGE
#else
freopen("Text.txt", "r", stdin);
#endif // ONLINE_JUDGE
int N, M; cin >> N >> M;
for (int i = 0; i < N; i++) {
int temp; cin >> temp;
v.push_back(temp);
}
for (int i = 0; i < M; i++) {
run.insert(v[i]);
}
int cnt = 0;
for (int i = M; i < N; i++) {
if (*run.begin() == INF) {
run = last;
last.clear();
cnt++;
}
if (*run.begin() < v[i]) {
ans[cnt].push_back(*run.begin());
run.erase(run.begin());
run.insert(v[i]);
}
else {
ans[cnt].push_back(*run.begin());
run.erase(run.begin());
run.insert(INF);
last.insert(v[i]);
}
}
for (int i = 0; i <= cnt; i++) {
int len = ans[i].size();
for (int j = 0; j < len; j++) {
printf("%d", ans[i][j]);
if (j != len - 1) printf(" ");;
}
if (i != cnt) printf("\n");
}
if (run.size() != 0) {
for (auto it = run.begin(); it != run.end(); it++) {
if (*it != INF) printf(" %d", *it);
}
}
printf("\n");
if (last.size() != 0) {
printf("%d", *last.begin());
for (auto it = last.begin(); it != last.end(); it++) {
if (it == last.begin()) continue;
printf(" %d", *it);
}
}
}
总场考试下来就90来分,100多名好像,我太废物了太废物了,第二题 different 和 difference 傻傻分不清,浪费了1个小时。 一直在想not be duplicated 和 different 不是同一个意思吗,后来才发现是the difference of two nums previously…差。
考完就开始一直写,一直写一直写,求个赞鼓励鼓励
最后希望大佬帮忙指出错误,让我学习学习,今年9月再战。
来源:oschina
链接:https://my.oschina.net/u/4342388/blog/4439232