有关考试需要注意的地方
1.需要打印准考证,黑白的还是彩印的都可以,这个无所谓,
2.考试提前10分钟到场即可,去得早也不开门,这个可能只适合武汉考试的同学
3.进入考场前,考场门口一般会张贴的有各个学生的姓名、准考证号、座位号,注意查看自己的座位号,进入考场后快速入座
4.进入考场后,依据座位号找到自己的座位入座,今年这场每台电脑上都有考生的照片及个人信息,注意验证
5.这时候考试前大概还有8分钟的时间,可以测试一下键盘的按键,以及提前编写如下的代码,并复制4份保存(因为现在就是你自己的座位,考试开始会方便一点)
#include
#include
#include
#include
6.注意有的考场不会提醒开始考试,考试也不是自动开始,可以在1:25-1:30这段时间手动选择开始考试,
7. 甲级考试一定要注意读题,注意读题,注意读题
8. 考试结束会以最后一次上传的代码为准,中间可以看到自己当前的提交和排名和分数,考试一般不是很难,放平心态,细心细心,
1.Sexy Primes
思路:写一个判断是否为素数的函数,对n, n-6, n+6进行判断,如果小的那个数满足就直接输出返回,否则对n+6进行验证。注意,若n不满足时,需要找到的是比n大的一个6-素数对,而不是任意一个素数都可以,刚开始没意识到这一点,有两个测试点一直过不去,但是example又可以过,迷了一段时间,所以一定要认真读题!!!
#include
using namespace std;
bool isprime(long long x){
if(x < 2)
return false;
for(long long i = 2; i*i <= x; i++){
if(x%i == 0)
return false;
}
return true;
}
int main(){
long long n;
cin>>n;
long long x = n-6, y = n+6, ans = 0;
if(isprime(n) && isprime(x))
ans = x;
else if(isprime(n) && isprime(y))
ans = y;
if(ans != 0){
printf("Yes\n%lld", ans);
return 0;
}
while(!(isprime(n)&&(isprime(n-6) || isprime(n+6)) )){
n++;
}
printf("No\n%lld", n);
return 0;
}
2.Anniversary 对参加校庆的人员进行统计分析
思路:使用map
#include
#include
#include
#include
3.Telefraud Detection
思路:依据规则分析电信诈骗嫌疑人及其群体,使用一个二维整型数组存储任意两人之间的通话信息,为0表示没有通话,1表示为短通话,2表示为一般通话,刚开始没有考虑一般通话,出现了问题,
再寻找群体时,本来是打算使用并查集去做,但是不太熟练没有想明白,采用的是设立一个visit数组,遍历所有嫌疑人,若与其他人有通信,则在同一行进行输出,并将该嫌疑人设为已遍历,感觉这个思路应该也可以,但是不知道为什么有一个测试点总是无法通过
#include
#include
using namespace std;
int map[1010][1010] = {0};
int main(){
int k,n, m;
vector ans;
scanf("%d %d %d", &k, &n, &m);
int x,y,t;
for(int i = 0; i < m ; i++){
scanf("%d %d %d", &x, &y, &t);
if(t <= 5)
map[x][y] = 1;
else
map[x][y] = 2;
}
for(int i = 1; i <= n; i++){
int a = 0, b = 0;
for(int j = 1; j<= n; j++){
if(map[i][j] == 1){
a++;
if(map[j][i]!=0)
b++;
}
}
if(a>k && b<=a/5)
ans.push_back(i);
}
if(ans.size() == 0){
printf("None");
return 0;
}
int vis[1010] = {0}, flag = 0;
for(int i= 0; i < ans.size(); i++){
if(vis[ans[i]] == 0){
if(flag == 1){
printf("\n");
}
flag = 1;
vis[ans[i]] = 1;
printf("%d", ans[i]);
}else
continue;
for(int j = 0; j < ans.size(); j++){
if(i!=j && (map[ans[i]][ans[j]] != 0 || map[ans[j]][ans[i]] != 0) && vis[ans[j]] == 0){
vis[ans[j]] = 1;
printf(" %d", ans[j]);
}
}
}
return 0;
}
4.Structure of a Binary Tree
思路:考试时给这道题留了一个半小时左右还是没写完,主要是没复习到怎么依据中序和后序建树,现场推错了好多遍,find函数忘记是返回迭代器了,考场dev使用的不是C++ 11规则,不支持stoi,然后,emm心态炸了
题目其实并不难,主要考察知识点就是通过中序和后序建树,然后对二叉树进行相关测试,由于数据量较小,结点值都小于1000,我这里直接采用tree二维数组来表示一棵树,一个结点的值直接表示它的序号,tree[i][0]表示结点i的左孩子,tree[i][1]表示结点i的右孩子,tree[i][2]表示结点i的父亲结点,由于问题中涉及兄弟结点、父亲结点、同层结点的问题,所以能够指向父亲结点的位置可以大大简化问题,
在对指令进行分析的过程中,需要stringstream这个类型的变量,不知道的同学可以百度一下,查看详细用法,使用它需要导入< sstream >头文件,主要用法如下
getline(cin, temp);
stringstream ss(temp);
vector que;
while(ss>>x)
que.push_back(x);
由于不知道每条指令的长度,使用stringstream可以方便的对每条指令的各个单词进行分割,分割之后我们就可以依据关键词(如root, parent, siblings)来判断是要执行什么操作了,接下来就很简单了。
emm,由于我考试时是没能做出这道题的,所以下来之后对代码进行完善测试,现在能够通过例子,但也不确定正确性怎么样,大家可以参考一下思路
#include
#include
#include
#include
using namespace std;
int tree[1010][3];
int n,m,root;
int post[30] = {0};
int in[30] = {0};
void build(int pb, int pe, int ib, int ie){
if(pb<0 || ib<0 ||pe >= n || ie>= n || pe=ib){
tree[r][0] = post[pb+j-1-ib];
tree[post[pb+j-1-ib]][2] = r;
build(pb, pb+j-1-ib, ib, j-1);
}
if(j+1<=ie){
tree[r][1] = post[pe-1];
tree[post[pe-1]][2] = r;
build(pb+j-ib, pe-1, j+1, ie);
}
}
bool islevel(int a, int b){
int da = 0, db = 0;
while(a != root){
da++;
a = tree[a][2];
}
while(b != root){
db++;
b = tree[b][2];
}
if(da == db)
return true;
else
return false;
}
bool isfull(){
int x = root;
for(int i = 1; i <= n; i++){
//要么有两个孩子要么没有孩子
if(!(tree[i][0] == 0 && tree[i][1]==0 || tree[i][0]!=0 && tree[i][1]!=0))
return false;
}
return true;
}
int main(){
string temp, x;
scanf("%d", &n);
for(int i = 0; i < n; i++)
scanf("%d", &post[i]);
for(int i = 0; i < n; i++)
scanf("%d", &in[i]);
root = post[n-1];
build(0, n-1, 0, n-1);
scanf("%d\n", &m);
for(int i = 0; i < m; i++){
getline(cin, temp);
stringstream ss(temp);
vector que;
while(ss>>x)
que.push_back(x);
if(que[que.size()-1] == "root"){
if(root == stoi(que[0]))
printf("Yes\n");
else
printf("No\n");
}else if(que[que.size()-1] == "siblings"){
int a = stoi(que[0]);
int b = stoi(que[2]);
int f = tree[a][2];
if(tree[f][0]==a && tree[f][1]==b || tree[f][0]==b && tree[f][1]==a)
printf("Yes\n");
else
printf("No\n");
}else if(que[3] == "parent"){
int f = stoi(que[0]);
int a = stoi(que[5]);
if(tree[a][2] == f)
printf("Yes\n");
else
printf("No\n");
}else if(que[3] == "left"){
int f = stoi(que[6]);
int a = stoi(que[0]);
if(tree[f][0] == a)
printf("Yes\n");
else
printf("No\n");
}else if(que[3] == "right"){
int f = stoi(que[6]);
int a = stoi(que[0]);
if(tree[f][1] == a)
printf("Yes\n");
else
printf("No\n");
}else if(que[que.size()-1] == "level"){
int a = stoi(que[0]);
int b = stoi(que[2]);
printf("%s\n", islevel(a,b)?"Yes":"No");
}else if(que[que.size()-1] == "tree"){
printf("%s\n", isfull()?"Yes":"No");
}
}
return 0;
}