Fudan 2020年夏令营编程摸底【可能是】
题目转载:感谢大大分享的原题目,感觉是真题
题目1:前置课程
代码及注释
#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
//BFS广度优先算法
class Solution {
private:
// 存储有向图
vector<vector<int>> edges;
// 存储每个节点的入度
vector<int> indeg;
// 存储答案
vector<int> result;
public:
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
edges.resize(numCourses);//resize——vector特有函数表示edges的大小为numCourses
indeg.resize(numCourses);
//for循环活久见,表示prerequisites(双vector)类型从头跑到尾,后面同理
for (const auto& info : prerequisites) {
edges[info[1]].push_back(info[0]);
++indeg[info[0]];
}
queue<int> q;
// 将所有入度为 0 的节点放入队列中
for (int i = 0; i < numCourses; ++i) {
if (indeg[i] == 0) {
q.push(i);
}
}
while (!q.empty()) {
// 从队首取出一个节点
int u = q.front();
q.pop();
// 放入答案中
result.push_back(u);
for (int v : edges[u]) {
--indeg[v];
// 如果相邻节点 v 的入度为 0,就可以选 v 对应的课程了
if (indeg[v] == 0) {
q.push(v);
}
}
}
if (result.size() != numCourses) {
return {};
}
return result;
}
};
//自己瞎写的测试用例,输出正确的0,1,2,3 但是另一种输不出来0,2,1,3
int main() {
Solution t;
vector<int>a = { 1,0 };
vector<int>b = { 2,0 };
vector<int>c = { 3,1 };
vector<int>d = { 3,2 };
vector<vector <int>>K = {a, b, c, d};
vector<int>res=t.findOrder(4, K);
vector<int>::iterator it = res.begin();
for (int i = 0; i < 3;i++) {
printf("%d,", *it);
it++;
}
printf("%d", *it);
return 0;
}
题目2:最大正方子矩阵
代码及注释
1、max min对应的库为algorithm
2、vector< vector > v(m, vector(n) );是什么意思
定义了一个vector容器,元素类型为vector,初始化为包含m个vector对象,每个对象都是一个新创立的vector对象的拷贝,而这个新创立的vector对象被初始化为包含n个0。
#include <iostream>
#include<vector>
#include<algorithm>
//#include <sstream>
//#include <string>
using namespace std;
//void input_vector(vector<vector<int>>&);
class Solution {
public:
int maximalSquare(vector<vector<int>>& matrix) {//char型??
int m = matrix.size();//行数
if (m == 0) return 0; //排除空矩阵
int n = matrix[0].size();//列数
int val1, val2, val3;
vector<vector<int> > dp(m, vector<int>(n, 0));//构建一个元素都是0的m*n矩阵dp_辅助数组
int maxlen = 0;
//左边界
for (int i = 0; i < m; ++i)
{
dp[i][0] = matrix[i][0] ;//matrix是char型的??
if (dp[i][0] == 1) maxlen = 1;
}
//上边界
for (int j = 0; j < n; ++j)
{
dp[0][j] = matrix[0][j];
if (dp[0][j] == 1) maxlen = 1;
}
for (int i = 1; i < m; ++i)
{
for (int j = 1; j < n; ++j)
{
if (matrix[i][j] == 0) continue;//本身是0,跳出本次循环
val1 = dp[i - 1][j - 1];//左上
val2 = dp[i - 1][j];//左
val3 = dp[i][j - 1];//上
dp[i][j] = min(val1, min(val2, val3)) + 1;//本身是1,要+1
maxlen = max(maxlen, dp[i][j]);
}
}
return maxlen;
}
};
/*void input_vector(vector<vector<int> >& vec)
{
vector<int> v;
while (!cin.eof()) {
int tmp(0);
v.clear();
string line;
getline(cin, line);
istringstream ss(line);
while (ss >> tmp) {
v.push_back(tmp);
}
vec.push_back(v);
}
}*/
int main()
{
//vector<vector<int>> vec;
//input_vector(vec);
Solution t;
vector<int>a = { 1,1,1,1,1 };
vector<int>b = { 1,1,1,1,1 };
vector<int>c = { 1,1,1,1,1 };
vector<int>d = { 1,0,0,1,0 };
vector<vector<int>>vec= {a, b, c, d};
int ans=t.maximalSquare(vec);
cout << ans;
//vector<vector<int>>::iterator it = vec.begin();
/*for (; it != vec.end(); ++it) {
vector<int>::iterator i = it->begin();
while (i != it->end()) {
cout << *i++ << " ";
}
cout << endl;
}*/
return 0;
}
【注释掉的部分代码为输入不确定大小的矩阵,不知道为什么vector会越界,恼火】
题目3:染色与查询 树
1.引入库
代码如下(示例):
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
2.读入数据
代码如下(示例):
data = pd.read_csv(
'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())
该处使用的url网络请求的数据。
总结
(未完待续)
难过,怎么会这么难,感觉自己代码能力太弱了。
祝福自己今年夏令营顺利,及时摸底都能在网上查到。