这次模拟题的难度类比考试题,会有难度梯度,也尽量能够区分大家的编程水平,正式考试时间为2个小时,一共5道题,题目不排除有英文的可能,允许查字典,考试地点届时看群公告,题解会随后发出,会有1道题涉及较复杂算法,有1道题较简单的算法但逻辑能力要求较强,有三道题为简单题,考验大家的编程水平,考试会有实时排名,排名的分数和AC题的时间,提交错误的罚时都会有影响,我们最终将根据排名,辅助其它方面一同决定最终留下的人员。
大家重点解题的具体思路,我不会给出每一句代码的思路,要自己阅读,仔细思考,加油!
A:A+B 简单题
Solution:
水题,希望大家熟悉环境,掌握输入输出的技巧,最后要有一个\n
#include<cstdio>
using namespace std;
int main(){
int a,b;
while(~scanf("%d%d",&a,&b)){
printf("%d\n",a+b);
}
return 0;
}
B:前n项和 简单题
Solution:
前n项和公式为:n*(n+1)/2,注意到结果可能在32位有符号整数之内,但是运算过程中两数相乘就有可能溢出,我们索性就用long long,别忘了每一个结果后跟一个空行。
#include<cstdio>
using namespace std;
int main(){
long long n,sum;
while(~scanf("%lld",&n)){
sum = n*(n+1)/2;
printf("%lld\n\n",sum);
}
return 0;
}
C:A*B 难题
Solution:
单纯的利用字符串进行模拟高精度乘法效率不够高,会出现TLE,所以我们需要使用NTT(快速数论变换)或者FFT(快速傅里叶变换)来求卷积,把10,100分别理解成阶.
这道题想带给大家的收获:
看起来简单的问题不一定简单,要对数字溢出有概念,要对效率有追求,对相关算法感兴趣的同学可以继续了解,不感兴趣的同学可以直接跳过,考试时如果做出这个难度的题那真的是一个不可多得人才。
此题较难,单独列出我的另一篇博文:
题解:http://blog.csdn.net/cfarmerreally/article/details/52668610
D:日期转换 简单题
Solution:
字符串处理,编程时注意相关的细节,也希望大家找到适合自己的代码风格。
#include <stdio.h>
char *sampm[] = {"am", "pm"};
int main() {
int t;
int year, month, day, hour, minute, second;
int ampm;
scanf("%d", &t);
while(t--){
scanf("%d/%d/%d-%d:%d:%d", &year, &month, &day, &hour, &minute, &second);
if(hour >= 12)
ampm = 1;
else
ampm = 0;
if(hour == 0)
hour = 12;
else if(hour > 12)
hour -= 12;
printf("%02d/%02d/%04d-%02d:%02d:%02d%s\n", month, day, year, hour, minute, second, sampm[ampm]);
}
return 0;
}
E: 字母转转转 中等题
Solution:
主要考验大家的细心和编程能力,本身不要求什么算法和数据结构,大家代码都好长,而我利用了两个数组表示方向,起个名字就叫方向数组吧。
#include<cstdio>
#include<cstring>
using namespace std;
char str[1000][1000];
int main(){
memset(str,0,sizeof(str));
int dirx[4] = {1,0,-1,0};
int diry[4] = {0,1,0,-1};
int r, c, idx = 0, dir = 0;
int now = 0, tot;
int x = 1, y = 1;
scanf("%d%d",&r,&c);
tot = r*c;
for(int i = 0; i <= c+1; ++i){
str[0][i] = '#'; str[r+1][i] = '#';
}
for(int i = 0; i <= r+1; ++i){
str[i][0] = '#'; str[i][c+1] = '#';
}
while(now < tot){
str[y][x] = 'A'+idx;
while(str[y+diry[dir]][x+dirx[dir]] != '\0' && now != tot-1)
dir = (dir+1)%4;
x += dirx[dir]; y += diry[dir];
now++; idx = (idx+1)%26;
}
for(int i = 1; i <= r; ++i){
for(int j = 1; j <= c; ++j)
printf(" %c",str[i][j]);
printf("\n");
}
return 0;
}
F:汉诺塔 中等题
Solution :
代码不长,主要考验大家的递归思维能力。
//代码来源于网络
#include <stdio.h>
__int64 bit[64] = {1};
int flag ;
void dfs(int a,int b,int c,int n,__int64 m)
{
if(flag)
return ;
if(!n)
return ;
if(m > bit[n - 1])
dfs(b,a,c,n-1,m-bit[n-1]);
else if(m == bit[n-1])
{
printf("%d %d %d\n",n,a,c);
flag = 1;
return ;
}
else
dfs(a,c,b,n-1,m);
}
int main()
{
for(int i = 1; i < 64; ++i)
bit[i] = bit[i - 1] << 1;
int n,t;
__int64 m;
scanf("%d",&t);
int a = 1, b = 2, c = 3;
while(t--)
{
scanf("%d%I64d",&n,&m);
flag = 0;
dfs(a,b,c,n,m);
}
return 0;
}
G:萌萌哒数(水仙花数) 简单题
Solution:
经典问题,编程模拟过程即可,考验大家的基础编程能力,并且适应环境。
#include <iostream>
using namespace std;
int main(){
int m,n,i;
while(cin>>m>>n)
{
if (m > n)
{
int temp = m;
m = n;
n = temp;
}
bool flag = false;
int count = 0;
for (i = m; i <= n; i++)
{
int a,b,c,s = i;
a = s % 10;
s = s / 10;
b = s % 10;
s = s / 10;
c = s;
s = a * a * a +b * b * b +c * c * c;
if (s == i)
{
if (count != 0)
cout<<" ";
cout<<i;
flag = true;
count++;
}
}
if (flag)
cout<<endl;
else
cout<<"no"<<endl;
}
return 0;
}
H:排序
Solution:
主要是让大家体会排序的编程思想,题目本身很简单,但是希望能从代码中看到大家手动实现的排序,通过对题目所给字符串的处理得到一些数字,然后对数字排序,关于排序我在另一篇博客中提到了计数排序等O(n)复杂度的排序,快排是(O(nlgn)级别),
http://blog.csdn.net/cFarmerReally/article/details/52123990?locationNum=1
#include <iostream>
using namespace std;
int comp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}
int main()
{
int i, j, k, a[1000], acount;
char str[1001], temp[10];
while(cin>>str)
{
j = 0;
acount = 0;
k = strlen(str);
if (str[k-1] != '5')
str[k++] = '5';
for(i = 0; i < k; i++)
{
if(str[i] == '5')
{
if(j != 0)
{
temp[j] = ' ';
a[acount++] = atoi(temp);
j = 0;
}
}
else
temp[j++] = str[i];
}
qsort(a, acount, sizeof(a[0]), comp);
for(i = 0; i < acount-1; i++)
cout<<a[i]<<" ";
cout<<a[acount-1]<<endl;
}
return 0;
}
希望大家能在这次模拟中有所收获,对环境充分熟悉,也希望大家最终能够取得好成绩