目录
题目来源复旦考研群群友分享~
题目一
输入一个 yyyymmdd 格式的时间,如 20190318,计算与 20190205 相差的天数,
取绝对值,所有输入在 19000101 和 21000101 之间。
样例输入:20190208
输出:3
#include <iostream>
#include<algorithm>
using namespace std;
int m[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };//存储每月天数,下标从1开始
int s[13];//存储前缀和
//判断是否是闰年
bool is_runnian(int year)
{
return (year % 400 == 0 || (year % 100 == 0 && year % 4 == 0));
}
int main()
{
int t;
cin >> t;
//计算月份的前缀和
for (int i = 1; i <= 13; i++)
s[i] = s[i - 1] + m[i];
int year = t / 10000;
int month = (t % 10000) / 100;
int day = t % 100;
int res = 0;
if (year >= 2019)
{
//处理年
res = (year - 2019) * 365;
//闰年是366天
for (int i = 2019; i < year; i++)
if (is_runnian(i))
res++;
//处理当年的月份和天数
res = res + (s[month - 1] - s[1]) + (day - 5);
if (is_runnian(year))
res++;
}
else
{
res += (2019 - year) * 365;
for (int i = year; i < 2019; i++)
if (is_runnian(i))
res += 1;
res += s[1] + 5;
res -= (s[month - 1] + day);
if (is_runnian(year))
if (month > 2)
res -= 1;
}
cout << res << endl;
return 0;
}
题目二
给定一个数组及其大小,数组元素在[-10^6,10^6],元素个数最多 10^6 个。
输出最大的连续子序列和,题目保证最后结果为正数。
解题核心思路:动态规划,f[i]表示以i结尾的最大连续子序列和,如果f[i-1]<0,则f[i]=a[i],否则f[i]=f[i-1]+a[i];
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 1000010, INF = 1e6 + 7;;
int f[N];//f[i]表示以i结尾的最大连续子序列的和
int a[N];
//状态转移方程 :f[i]=(f[i-1]+a[i],a[i])
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++)
cout << a[i];
//初始化f为无穷小
memset(f, -INF, sizeof f);
for (int i = 1; i <= n; i++) {
//如果f[i-1]<0则必然会选择a[i],反之会有f[i]=f[i-1]+a[i]
f[i] = max(f[i - 1] + a[i], a[i]);
}
cout << f[n] << endl;
return 0;
}
题目三
给定二叉树的节点总数 n,输出二叉树形态总数,n<= 1000
样例输入:3
输出:5
相当于给定的入栈顺序,求有多少中出栈序列,即求卡特兰数
#include <iostream>
using namespace std;
typedef long long LL;
int main() {
int n;
cin >> n;
LL fenzi = 1,fenmu=1;
for (int i = 2 * n; i > n; i--)
fenzi *= i;
for (int i = 1; i <= n; i++)
fenmu *= i;
cout << (fenzi/fenmu)/(n+1) << endl;
return 0;
}