机试:
一、计算机学院:
1、
算法笔记上有类似题,且time与time2都是输入。
而本体time是输入,time2是题目给的。
设置time与time2,为计算方便设定让time恒小于time2。
方法:从time(较早的日期)一天一天加,直到time2为止。期间设置一个int型的num来记录相差天数。
#include <cstdio>
#include <algorithm>
using namespace std;
int month[13][2] = {{0, 0}, {31, 31}, {28, 29}, {31, 31}, {30, 30}, {31, 31}, {30, 30}, {31, 31}, {31, 31}, {30, 30}, {31, 31}, {30, 30}, {31, 31}};
int isrunnian(int y){
int flag = 0;
if((y % 4 == 0 && y % 100 != 0) || y % 400 == 0){
flag = 1;
}
return flag;
}
int main(){
int time, num = 0;
int time2 = 20190205;
scanf("%d", &time);
if(time > time2){ //time恒小于time2
int temp = time2;
time2 = time;
time = temp;
}
int yy = time / 10000, mm = time % 10000 / 100, dd = time % 100;
int YY = time2 / 10000, MM = time2 % 10000 / 100, DD = time2 % 100;
while(yy != YY || mm != MM || dd != DD){
dd++;
num++;
if(dd > month[mm][isrunnian(yy)]){
mm++;
dd = 1;
}
if(mm > 12){
yy++;
mm = 1;
}
}
printf("%d", num);
return 0;
}
2、
完全是算法笔记的原题,求最大连续子序列和,在这里使用动态规划来解。
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 1000010;
int A[maxn], dp[maxn];
int main(){
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++){
scanf("%d", &A[i]);
}
dp[0] = A[0];
for(int i = 1; i < n; i++){
if(dp[i - 1] + A[i] > A[i]){
dp[i] = dp[i - 1] + A[i];
}else{
dp[i] = A[i];
}
}
int ans = dp[0];
for(int i = 1; i < n; i++){
if(dp[i] > ans){
ans = dp[i];
}
}
printf("%d", ans);
return 0;
}
3、
emmm,这题要是自己一一实现的话略微困难,而且本题适合用Java的大数来做,用C++会有案例不能通过。
通过百度得知,本题用卡特兰数(Catalan数)可以直接解决。。。
由于Java不会用。。。所以给出C++版本:
#include <cstdio>
int main(){
int n;
scanf("%d", &n);
long long num, a = 1, b = 1;
for(int i = 2 * n; i > n; i--){
a *= i;
}
for(int i = n; i > 0; i--){
b *= i;
}
printf("%lld", a / b / (n + 1));
return 0;
}
对没错,就是这么简单几行代码,不会这个公式就很难,会这个公式轻松解决。不过依旧只能处理n <= 14的情况,n > 14则会导致输出错误。
二、工研院:
1、
还可以挺简单,就是设数组有点累。。。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
char numtochar[10][5] = {{'0', '0', '0', '0', '0' }, {'0', '0', '0', '0', '0'}, {'A', 'B', 'C', '0', '0'}, {'D', 'E', 'F', '0', '0'},
{'G', 'H', 'I', '0', '0'}, {'J', 'K', 'L', '0', '0'}, {'M', 'N', 'O', '0', '0'}, {'P', 'Q', 'R', 'S', '0' },
{'T', 'U', 'V', '0', '0' }, {'W', 'X', 'Y', 'Z', '0'}};
int main(){
string str;
getline(cin, str);
int num = 0;
for(int i = 0; i < str.length(); i++){
if(str[i] == '-') continue;
if(str[i + 1] != str[i]){
printf("%c", numtochar[str[i] - '0'][num]);
num = 0;
}else{
num++;
}
}
return 0;
}
第二题学长们的回忆版题目看不大懂,
第三题实在不会。。。
题目资源均来自王道论坛。