计院

A 相隔天数

输入一个 yyyymmdd 格式的时间,如 20190318,计算与 20190205 相差的天数,

取绝对值,所有输入在 19000101 和 21000101 之间。

样例输入:20190208

输出:3

#include<iostream>using namespace std;int month_day[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 Isrunyear(int year){if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) return 1;return 0;
}
int main(){int y1,y2 = 19001001;cin >> y1;if(y1 < y2) swap(y1,y2);int year1 = y1 /10000,month1 = (y1/100) % 100,day1 = y1 % 100;int year2 = y2 /10000,month2 = (y2/100) % 100,day2 = y2 % 100;int num = 0;while(year1 > year2 || month1 > month2 || day1 > day2){num++;day2++;if(day2 == month_day[month2][Isrunyear(year2)] + 1) {  //这里没考虑好二维矩阵下标问题。全局变量越界访问等于访问0day2 = 1;month2++;}if(month2 == 13) {month2 = 1;   //这里=写成==year2++;}}cout << num;return 0;
}
// 出现问题耐心调试!

备注写了些写的过程中的错误。一道并不难的题写了很久。。。细节问题要注意。继续加油吧~

B 最大连续子序列

//10.24
#include<iostream>
#include<vector>
using namespace std;vector<int> a,dp;
int main(){int n;cin >> n;a.push_back(0);for(int i = 1;i <= n;i++) {int x;cin >> x;a.push_back(x);}int max1 = 0;for(int i = 0;i <= n;i++)dp.push_back(0);for(int i = 1;i <= n;i++){int sum = dp[i - 1] + a[i];if(sum < 0 ) dp[i] = 0;else {dp[i] = sum;max1 = max(max1,sum);}} cout << max1;return 0;
}

DP问题

状态定义:dp[i]表示以第i个数结尾的序列集合中的最大值

状态划分:以sum = dp[i - 1] + a[i]是否大于0划分(因为本题答案一定为正数,所以可以这么划分)

C 二叉树形态

#include<iostream>
#include<vector>
using namespace std;const int N = 21;
long long dp[N];
int main(){int n ;cin >> n;dp[0] = 1;dp[1] = 1;for(int i = 2;i <= n;i++){long long sum = 0;for(int j = 0;j <= i - 1;j++)sum += dp[j] * dp[i - j - 1];dp[i] = sum;}cout << dp[n];return 0;
}

状态定义:dp[i]表示节点数为i的二叉树形态有几个

状态划分:根据根节点的左右子树有0 、 1、 2...i-1个来划分

都是很简单的dp问题,可是自己就是想不出来。。。吐了。。。

工研院

A 九键输入

//11.58
#include<iostream>
#include<vector>
#include<map>using namespace std;
char input[100];
const int N = 21;
map<int,char> g;int main(){int num = 0;for(int i = 2;i <= 7;i++){int k = i;for(int j = 1;j <= 3;j++, k = k* 10 + i){g.insert({k,'a' + num});num++;}}g.insert({0,' '});g.insert({7777,' S'});g.insert({8,' T'});g.insert({88,' U'});g.insert({888,' V'});g.insert({9,' W'});g.insert({99,' X'});g.insert({999,' Y'});g.insert({9999,' Z'});int length = 0;while(cin >> input[length++]); //字符串输入for(int i = 0;i < length - 1;i++){if(input[i] == '-') continue;if(input[i] == '0') {cout << ' ';continue;}char output = input[i];int num = output - '0';int j = 1;while(input[i + 1] == output) i++,j++;if(j == 1) cout << g[num];if(j == 2) cout << g[num * 10 + num];if(j == 3) cout << g[num * 100 + num * 10 + num];}return 0;
}

其实可以用二维数组存的,会更加方便一些。

B 服务器维护

假设有编号从1-N的服务器,首先给出服务器个数,再给出一组服务器状态。
然后给出一次数字,表示修改状态次数,接下来输入为i,j,x,意思是使用x修改从i到j的服务器。
最后输出所有服务器状态
例:
输入:
5
1 2 2 3 1
2
1 2 5
2 5 -1
输出:
6 6 1 2 0

#include<iostream>
using namespace std;int main(){int n;cin >> n;int a[n + 2],b[n + 2]; //0,n+1可能会访问到,所以多加2a[0] = b[0] = 0;for(int i = 1;i <= n;i++) cin >> a[i];for(int i = 1;i <= n;i++) b[i] = a[i] - a[i - 1];int m;cin >> m;while(m--){int l,r,x;cin >> l >> r >> x;b[l] += x;b[r + 1] -= x;}for(int i = 1;i <= n;i++) {a[i] = a[i - 1] + b[i]; cout << a[i] << ' ';}return 0;
}

前缀和与差分

前缀和:可用来求数组a中第i到第j个数的和

如何生成前缀和

//a为数组值,s为前缀和  注意为了之后运算方便,a、s都从下标1开始存。下标0定义为0。
s[0] = 0;
for(int i = 1;i <= n;i++)s[i] = s[i - 1] + a[i]

如何求区间和

sum_ij = s[j] - s[i - 1]

差分——前缀和逆运算:可用来是数组的某一区间里的数加上同一个数值

设原数组为a1,a2...an,构造b数组使a数组为b数组的前缀和。即b数组为a数组的差分。

b1 = a1

b2 = a2 - a1

b3 = a3 - a2

...

bn = an - a(n-1)

则 ai = b1 + b2 + ... + bi

若bi + c,则原数组ai ai+1 ... an都加上c。 因为ai = b1 + b2 + .. + bi + c,ai + 1 = b1 + b2 + ...+bi + c + bi+1以此类推

同理若bj -  c,则原数组aj ,aj+1 ... an都会减去c。

故若想让ai到aj这个的数都加上c,只需bi + c,bj+1 - c。

C 计算通讯代价

给定一个无向图,保证是一棵树,定义两个结点 ab 之间的通信代价为 ab 路径

上的边的数目,节点 a 的通信代价为 a 到其他所有节点的通信代价之和。在一

行中输出所有结点的通信代价。

样例输入:

4

1 2

2 3

2 4

输出:

5 3 5 5

#include<iostream>
#include<cstring>
using namespace std;int g[10][10];void Dig(int i,int n){bool flag[n + 1];memset(flag,0,sizeof(flag));flag[i] = true;int m = n - 1;while(m--){int min1 = 0x3f3f3f3f,pos;for(int k = 1;k <= n;k++)if(g[i][k] < min1 && !flag[k]){ // 找到集合外最小值min1 = g[i][k];pos = k;}flag[pos] = true;for(int k = 1;k <= n;k++)if(g[i][k] > g[i][pos] + g[pos][k] && !flag[k])g[i][k] = g[i][pos] + g[pos][k];}
}int main(){int n;cin >> n;int m = n - 1;memset(g,0x3f,sizeof(g));while(m--){int x,y;cin >> x >> y;g[x][y] = 1;g[y][x] = 1;}for(int i = 1;i <= n;i++)Dig(i,n);int sum[n + 1];memset(sum,0,sizeof(sum));for(int i = 1;i <= n;i++)for(int j =1;j <= n;j++)if(g[i][j] != 0x3f3f3f3f) sum[i] +=g[i][j];for(int i = 1;i <= n;i++) cout << sum[i] << ' ';return 0;
}

想了一个时间复杂度为n^3的算法。分别以树中的每个顶点为源点使用digstra算法求出该点到其他点的最短距离,然后再算出来每个点到其他店的距离总和。估计大数据的时候可能会超时。

感觉工研院的机试和计院还是不太一样,计院基本上每年都会考DP,工研院这三道题则完全没有DP。

复旦计院、工研院2019机试真题及答案详解相关推荐

  1. 复旦计院、工研院2018机试真题及答案详解

    计院 A 求众数 众数就是一个序列中出现次数最多的数字. 如果不唯一,则输出小的那个值.   给定第一个代表有几个数字.  1<=n<=10^5   每个数字在 int 范围内 样例:  ...

  2. 2018北邮网研院机试真题

    2018北邮网研院机试真题(答案仅供参考) 根据刚机试结束的同学回忆,今年北邮机试题目下,并附上本人解答.(应该有一些细节没考虑,如果发现问题,欢迎留言指正交流) 大神就当看个笑话 =.= Probl ...

  3. 中科大-计算机类考研真题(初试笔试真题详解+复试笔试机试真题详解+面试问题汇总分析)

    中科大-计算机类考研真题(初试笔试真题详解+复试笔试机试真题详解+面试问题汇总分析) 初试笔试真题2003年~2019年:答案+详解 复试面试问题总结:问题汇总+详解分析 复试面试经验总结:个人小结 ...

  4. 2019北邮网安院机试真题(回忆版)@lantin

    2019北邮网安院机试真题(回忆版) 细不谈,前两题真的都是签到题,会简单排序和if-else都可以写的出来的题目.网安院的机试基本上是两道签到题,C题是数据结构题,D题是算法.做到保2争3,保3争4 ...

  5. 2019北邮计算机院机试真题

    目录 19计算机院机试真题 Problem A 二进制 Problem B 二叉树 Problem C 最短路径 Problem D 方块阵 19计算机院机试真题 计算机院的机试题真难,没有4A的,第 ...

  6. 二叉排序树[2005年华中科技大学计算机保研机试真题]

    题目描述: 输入一系列整数,建立二叉排序树,并进行前序,中序,后序遍历. 输入: 输入第一行包括一个整数n(1<=n<=100). 接下来的一行包括n个整数. 输出: 可能有多组测试数据, ...

  7. [华为机试真题][2014]62.去除重复字符并排序

    题目 描述: 去除重复字符并排序 运行时间限制: 无限制 内容限制: 无限制 输入: 字符串 输出: 去除重复字符并排序的字符串 样例输入: aabcdefff 样例输出: abcdef 代码 /*- ...

  8. 转:[C/C++]2014年7月华为校招机试真题(一)

    [C/C++]2014年7月华为校招机试真题(一) 转载于:https://www.cnblogs.com/kira2will/p/4039521.html

  9. 【互联网大厂机试真题 - 华为】九宫格

    前言:本专栏将持续更新互联网大厂机试真题,并进行详细的分析与解答,包含完整的代码实现,希望可以帮助到正在努力的你.关于大厂机试流程.面经.面试指导等,如有任何疑问,欢迎联系我,wechat:steve ...

最新文章

  1. 移动端取消button点击出现阴影效果
  2. mysql字符集查看_查看和设置mysql字符集
  3. matlab sol函数,sol=bvp4c(@f,@fsbc,solinit)解决有上下限的ODE函数
  4. 开发日记-20190527 关键词 ubuntu无线网卡驱动安装
  5. 30年职场生涯的感悟[转]
  6. java构造方法和实例化,10. JavaSE-子类实例化过程 构造方法间调用
  7. LeetCode-76: 最小覆盖子串
  8. 域做文件服务器,linux 做域文件服务器
  9. Java面试基础部分合集
  10. 150页的剑指Offer解答PDF,它来了!!!
  11. 医院计算机五大应用系统,医疗系统计算机应用的现状与发展
  12. VxLAN技术基本原理
  13. python画指北针_Python-geopandas 中国地图绘制
  14. OpenLayers - 加载静态图片(十二)
  15. Java使用MongoTemplate操作MangoDB,实现根据时间等条件组合查询,解决ISODate的问题
  16. 选取一段代码块一下子都回退或前进空一格的快捷键
  17. 【读书1】【2017】MATLAB与深度学习——代价函数与学习规则(4)
  18. js中[object,object]是什么,怎么取值
  19. kubectl使用参数--kubeconfig指定不同 .kube/config 文件访问以不同集群
  20. 使用百度云识别图片中的文字(二):获取图片中的文字

热门文章

  1. GET/POST 和TCP/UDP 区别
  2. 7-2 求一元二次方程的根
  3. 16.控制转移指令(条件跳转指令、比较条件跳转指令、多条件分支跳转指令、无条件跳转指令)
  4. Macbook pro md318 升级SSD以及8G内存过程以及问题总结
  5. acmore|acmore.cc1211采油区域1212会议中心1213抢掠计划APIO2009
  6. 银行客户信用风险评估项目
  7. TRS cms用户注册漏洞
  8. Linux上vim编辑器使用教程
  9. WeWork入华 盈利奇迹能否复制
  10. ADF单位根检验方法