1 Star 0 Fork 0

Hisami / Hisami

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
content.json 31.19 KB
一键复制 编辑 原始数据 按行查看 历史
Hisami 提交于 2021-01-15 01:41 . Site updated: 2021-01-15 01:41:06
{"meta":{"title":"Hisamiのblog","subtitle":"Hisami","description":"","author":"Hisami","url":"https://hisami.gitee.io","root":"/"},"pages":[{"title":"categories","date":"2020-08-15T12:38:08.000Z","updated":"2020-08-17T05:51:45.599Z","comments":true,"path":"categories/index.html","permalink":"https://hisami.gitee.io/categories/index.html","excerpt":"","text":""},{"title":"tags","date":"2020-08-15T12:37:31.000Z","updated":"2020-08-17T05:51:24.241Z","comments":true,"path":"tags/index.html","permalink":"https://hisami.gitee.io/tags/index.html","excerpt":"","text":""},{"title":"about","date":"2020-08-15T12:33:36.000Z","updated":"2020-08-15T12:34:44.670Z","comments":true,"path":"about/index.html","permalink":"https://hisami.gitee.io/about/index.html","excerpt":"","text":"尚未添加任何信息~"}],"posts":[{"title":"景区导航系统","slug":"景区导航系统","date":"2020-12-07T14:57:53.000Z","updated":"2020-12-11T16:53:48.772Z","comments":true,"path":"2020/12/07/景区导航系统/","link":"","permalink":"https://hisami.gitee.io/2020/12/07/%E6%99%AF%E5%8C%BA%E5%AF%BC%E8%88%AA%E7%B3%BB%E7%BB%9F/","excerpt":"","text":"Graph.py 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440import mathimport matplotlib.pyplot as pltclass Node(object): # 景点 def __init__(self, data, x, y, name, intro, next = None): self.data = data # 编号 self.name = name # 名称 self.x = x # 横坐标 self.y = y # 纵坐标 self.intro = intro # 简介 self.next = next # 指向下一个结点class ChainTable(object): adj = [[float("inf") for x in range(41)] for y in range(41)] # 邻接矩阵 dis = [[float("inf") for z in range(41)] for w in range(41)] # 邻接矩阵 path = [[-1 for p in range(41)] for q in range(41)] # 邻接矩阵 pathStr = "" def __init__(self): self.head = None self.length = 0 def getScenic(self): self.getMap() self.getEdge() def getMap(self): # 从文件读取景点信息,一次性操作 spotfile = open("./ScenicInfo/spot.txt",encoding='utf-8') # 打开景点文件 for line in spotfile.readlines(): curLine = line.strip().split(" ") data = curLine[0] x = curLine[1] y = curLine[2] name = curLine[3] intro = curLine[4] self.append(Node(data, x, y, name, intro)) spotfile.close() return def getEdge(self): edgefile = open("./ScenicInfo/edge.txt",encoding='utf-8') # 打开边文件 i = 0 for line in edgefile.readlines(): curLine = line.strip().split(" ") i += 1 for j in range(1, self.length + 1): if curLine[j-1].isdigit(): self.adj[i][j] = int(curLine[j-1]) if curLine[j-1] == "inf": self.adj[i][j] = float("inf") edgefile.close() return def updateMap(self): # 更新地图 node = self.head with open("./ScenicInfo/spot.txt", 'w', encoding='utf-8') as obj: # 文件覆写模式 for i in range(1, self.length + 1): if i == 1: obj.write("%s %s %s %s %s" % (node.data, node.x, node.y, node.name, node.intro)) else: obj.write("\\n%s %s %s %s %s" % (node.data, node.x, node.y, node.name, node.intro)) node = node.next return def updateEdge(self): # 更新路径 with open("./ScenicInfo/edge.txt", 'w', encoding='utf-8') as obj: for i in range(1, self.length + 1): if i != 1: obj.write("\\n") for j in range(1, self.length + 1): obj.write("%s " % self.adj[i][j]) return def append(self, newNode): # 添加结点到链表 item = newNode if not self.head: # 如果链表中还没有结点,则添加为头结点 self.head = item self.adj[1][1] = 0 self.length += 1 else: # 如果链表中已有结点,检查新增结点编号及坐标是否重合 node = self.head for i in range(1, self.length+1): if node.data == item.data: print("编号已存在!") return if node.x == item.x and node.y == item.y: print("坐标已存在!") return if i != self.length: node = node.next node.next = item self.adj[i+1][i+1] = 0 self.length += 1 self.updateMap() return def append2(self, newNode): # 添加结点到链表 item = newNode error = 0 if not self.head: # 如果链表中还没有结点,则添加为头结点 self.head = item self.adj[1][1] = 0 self.length += 1 else: # 如果链表中已有结点,检查新增结点编号及坐标是否重合 node = self.head for i in range(1, self.length+1): if node.data == item.data: error = 1 return error if node.x == item.x and node.y == item.y: error = 2 return error if i != self.length: node = node.next node.next = item self.adj[i+1][i+1] = 0 self.length += 1 self.updateMap() return error def delete(self, data): # 从链表删除结点 node = self.head prev = self.head # 前驱结点 flag = 0 for j in range(1, self.length + 1): if node.data == data: # 找到编号为data的结点 flag = 1 if j == 1: # 如果是头结点 self.head = self.head.next else: # 如果非头结点 prev.next = node.next self.removeRoad(j) self.length -= 1 break prev = node node = node.next if flag == 1: self.updateMap() self.updateEdge() return True else: return False def update(self, data, name, x, y, intro): node = self.head flag = 0 for i in range(1, self.length + 1): if node.data != data and node.x == x and node.y == y: return False node = node.next node = self.head for i in range(1, self.length + 1): if node.data == data: flag = 1 node.x = x node.y = y node.name = name node.intro = intro # 修改景点间的路长 self.updateRoad(i) node = node.next if flag == 1: self.updateMap() return True else: return False def getInfo(self, data): node = self.head flag = 0 for i in range(1, self.length+1): if node.data == data: flag = 1 break node = node.next if flag == 1: x = node.x y = node.y name = node.name intro = node.intro return x,y,name,intro else: return False def FindKeyword2(self, kw): # 搜索关键词 keyword = kw node = self.head flag = False for i in range(1, self.length+1): name = node.name intro = node.intro if name.find(keyword) != -1 or intro.find(keyword) != -1: flag = True print("景点编号:%s" % node.data) if name.find(keyword) != -1: print("名称:%s" % node.name) if intro.find(keyword) != -1: print("介绍”:%s" % node.intro) node = node.next if flag == False: print("搜索结果为空.") return # 对边的操作 def addRoad2(self, d1, d2): # 添加路径 data1 = d1 data2 = d2 flag1 = False flag2 = False node1 = self.head node2 = self.head for i in range(1, self.length+1): if node1.data == data1: flag1 = True break node1 = node1.next for j in range(1, self.length+1): if node2.data == data2: flag2 = True break node2 = node2.next if flag1==True and flag2==True: self.adj[i][j] = self.pg(node1.x, node1.y, node2.x, node2.y) self.adj[j][i] = self.adj[i][j] self.updateEdge() return 0 else: if flag1==False: return 1 if flag2==False: return 2 def pg(self, x1, y1, x2, y2): # 勾股定理 intx1 = int(x1) inty1 = int(y1) intx2 = int(x2) inty2 = int(y2) x = intx1 - intx2 y = inty1 - inty2 res = math.sqrt(x**2 + y**2) return int(res) def delRoad2(self,d1,d2): # 删除路径 data1 = d1 data2 = d2 flag1 = False flag2 = False node1 = self.head node2 = self.head for i in range(1, self.length+1): if node1.data == data1: flag1 = True break node1 = node1.next for j in range(1, self.length+1): if node2.data == data2: flag2 = True break node2 = node2.next if flag1==True and flag2==True: self.adj[i][j] = float("inf") self.adj[j][i] = float("inf") self.updateEdge() return 0 else: if flag1==False: return 1 if flag2==False: return 2 def removeRoad(self, pos): # 删除点时更新矩阵 while pos < self.length+1: for i in range(1, self.length+1): self.adj[i][pos] = self.adj[i][pos+1] for i in range(1, self.length+1): self.adj[pos][i] = self.adj[pos+1][i] pos += 1 return def updateRoad(self, pos): pnode = self.head # 刚修改的点 tnode = self.head # 连接点 for i in range(1, pos): pnode = pnode.next for i in range(1, self.length+1): if self.adj[pos][i] != 0 and self.adj[pos][i] != float("inf"): self.adj[pos][i] = self.pg(pnode.x, pnode.y, tnode.x, tnode.y) self.adj[i][pos] = self.adj[pos][i] tnode = tnode.next self.updateEdge() return # 找到2点间的路 def bfs(self, s, e): # 传入起点和终点 def Floyd(self, s, e): self.pathStr = "" for i in range(1, self.length+1): for j in range(1, self.length+1): self.dis[i][j] = self.adj[i][j] for k in range(1, self.length+1): # 找中转点 for i in range(1, self.length+1): # 线段一端 for j in range(1, self.length+1): # 线段另一端 if self.dis[i][j] > self.dis[i][k] + self.dis[k][j]: self.dis[i][j] = self.dis[i][k] + self.dis[k][j] self.path[i][j] = k self.printPath(s, e) def getPath(self,s, e): if self.path[s][e] == -1: self.pathStr += "->" + self.getSpotName(e) else: self.getPath(s, self.path[s][e]) self.getPath(self.path[s][e], e) def printPath(self, s, e): if self.dis[s][e] == self.adj[s][e] and self.adj[s][e] != float("inf"): self.pathStr = "最短距离为%s.\\nPath:%s->%s" % (self.dis[s][e], self.getSpotName(s),self.getSpotName(e)) return if self.path[s][e] == -1: self.pathStr = "%s到%s没有通路." % (self.getSpotName(s),self.getSpotName(e)) return else: self.pathStr += "最短距离为" + "%s" % self.dis[s][e] + ".\\n" self.pathStr += "Path:" + self.getSpotName(s) self.getPath(s, e) def FindRoad2(self, d1, d2): data1 = d1 data2 = d2 node1 = self.head node2 = self.head flag1 = False flag2 = False for i in range(1, self.length+1): if node1.data == data1: flag1 = True break node1 = node1.next for j in range(1, self.length+1): if node2.data == data2: flag2 = True break node2 = node2.next if flag1==True and flag2==True: self.Floyd(i, j) return 0 # if self.Floyd(i, j) == False: # return 0 # else: # end, step, visited = self.Dijkstra2(i, j) # return end, step, visited else: if flag1 == False: return 1 if flag2 == False: return 2 return def Dijkstra2(self, s, e): vis = [] # 已访问 unvis = [] # 未访问 dis = [float("inf")] # 记录s到各点的路径长度 for i in range(1, self.length+1): unvis.append(i) # 所有点加入未访问list dis.append(self.adj[s][i]) # s到各个点的边权加入dis_list cur = s for j in range(1, self.length+1): # 保证每个点都查找过 mindex = 0 # dis[mindex] = dis[0] = float("inf“") for i in range(1, self.length+1): if self.adj[cur][i] != 0 and self.adj[cur][i] != float("inf") and (i in unvis): nbr = i dis[nbr] = min(dis[nbr], dis[cur]+self.adj[cur][i]) if dis[mindex] > dis[nbr]: mindex = nbr unvis.remove(cur) vis.append(cur) if mindex != 0: cur = mindex else: break if dis[e] != float("inf"): return e, dis[e], vis else: return False def getSpotName(self, index): node = self.head for i in range(1, index): node = node.next return node.name def getSpotPos(self, index): # 获取坐标 node = self.head for i in range(1, index): node = node.next return node.x, node.y def PaintMap(self): # plt.style.use('dark_background') plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决plt绘图过程中中文无法显示的问题 # plt.xlim(-1, 20) # plt.ylim(0, 30) plt.axis('on') node = self.head x = [] y = [] name = [] x_value = [] y_value = [] for i in range(1, self.length+1): x.append(int(node.x)) y.append(int(node.y)) name.append(node.name) node = node.next plt.scatter(x, y, s=10, c="#00FFFF", alpha=1) plt.scatter(x, y, s=60, c="#FFFF00", marker='o', edgecolors='g') for i in range(self.length): plt.text(int(x[i]), int(y[i]), name[i],fontsize=10,color="#00FFFF") for i in range(1, self.length+1): for j in range(1, self.length+1): if self.adj[i][j] != 0 and self.adj[i][j] != float("inf"): x1, y1 = self.getSpotPos(i) x2, y2 = self.getSpotPos(j) x_value.append(int(x1)) y_value.append(int(y1)) x_value.append(int(x2)) y_value.append(int(y2)) plt.plot(x_value, y_value,linestyle=':',linewidth=1,c="#00BFFF",alpha=0.5) x_value.clear() y_value.clear() FindAllRoad.py 1234567891011121314151617181920212223242526# 找到所有从start到end的路径def findAllPath(graph, start, end, path=''): path = path + start if start == end: path += '\\n' return path paths = '' # 存储所有路径 for node in graph[start]: if node not in path: newpaths = findAllPath(graph, node, end, path) for newpath in newpaths: paths += newpath return pathsgraph = {'A': ['B', 'C', 'D'], 'B': ['A', 'D', 'E'], 'C': ['A', 'D', 'F'], 'D': ['A', 'B', 'C', 'E', 'F', 'G'], 'E': ['B', 'D', 'G'], 'F': ['C', 'D', 'G'], 'G': ['D', 'E', 'F']}allpath = findAllPath(graph, 'B', 'A')print('所有路径:\\n%s' % allpath)","categories":[{"name":"课程设计","slug":"课程设计","permalink":"https://hisami.gitee.io/categories/%E8%AF%BE%E7%A8%8B%E8%AE%BE%E8%AE%A1/"}],"tags":[{"name":"python","slug":"python","permalink":"https://hisami.gitee.io/tags/python/"}]},{"title":"蓝桥杯2020省赛第一场","slug":"蓝桥杯第十一届第一场真题解析","date":"2020-10-11T03:11:15.000Z","updated":"2020-10-14T03:49:52.424Z","comments":true,"path":"2020/10/11/蓝桥杯第十一届第一场真题解析/","link":"","permalink":"https://hisami.gitee.io/2020/10/11/%E8%93%9D%E6%A1%A5%E6%9D%AF%E7%AC%AC%E5%8D%81%E4%B8%80%E5%B1%8A%E7%AC%AC%E4%B8%80%E5%9C%BA%E7%9C%9F%E9%A2%98%E8%A7%A3%E6%9E%90/","excerpt":"","text":"D REPEAT程序 【问题描述】 附件 prog.txt 中是一个用某种语言写的程序。 其中 REPEAT k 表示一个次数为 k 的循环。循环控制的范围由缩进表达, 从次行开始连续的缩进比该行多的(前面的空白更长的)为循环包含的内容。 例如如下片段: REPEAT 2: A = A + 4 REPEAT 5: REPEAT 6: A = A + 5 A = A + 7 A = A + 8 A = A + 9 该片段中从 A = A + 4 所在的行到 A = A + 8 所在的行都在第一行的 循环两次中。 REPEAT 6: 所在的行到 A = A + 7 所在的行都在 REPEAT 5: 循环中。 A = A + 5 实际总共的循环次数是 2 × 5 × 6 = 60 次。 请问该程序执行完毕之后,A 的值是多少? 【答案提交】 这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个 整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。 【思路一】 123456789101112131415161718192021222324252627282930313233#include<cstdio>#include<cstring> #include<iostream>using namespace std;const int mx = 100000;int a[mx], b[mx]; //第i层循环的缩进,第i层的循环次数 char s[mx];int main(){ freopen("prog.txt", "r", stdin); gets(s); int pos = 0, ans = 0, w = 1; a[0] = -1, b[0] = 1; //a[i]表第i层循环的缩进,b[i]表第i层循环次数 while(gets(s)){ int n = strlen(s), p = 0; while(s[p] == ' ') p++; while(a[pos] >= p) w /= b[pos--]; if(s[n-1] == ':'){ int k = s[n-2]-'0'; pos = pos+1; w *= k; a[pos] = p, b[pos] = k; }else{ int k = s[n-1] - '0'; ans += k*w; } } printf("%d\\n", ans); return 0;} 【思路二】 巧用python。将txt里的”repeat i:”语句全部替换为”for i in range(0, i):”,运行程序得答案 E 矩阵 【问题描述】 把 1 ∼ 2020 放在 2 × 1010 的矩阵里。要求同一行中右边的比左边大,同一 列中下边的比上边的大。一共有多少种方案? 答案很大,你只需要给出方案数除以 2020 的余数即可。 【答案提交】 这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个 整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。 【标签】动态规划 【思路】 12345678910111213141516171819202122#include<cstdio>#include<iostream>using namespace std;const int mx = 2020+5, MOD = 2020;int dp[mx][mx]; //dp[i][j]:目前枚举i个数,j个放在第一行的方案数int main(){ int n = 2020; dp[1][1] = 1; //数字1必定放在第1行,否则不合法 for(int i = 2; i <= n; i++){ for(int j = 1; j <= i; j++){ //i放第一行 dp[i][j] += dp[i-1][j-1]; //i放第二行,需满足放完i之后第一行个数 ≤ 第二行 if(i-j <= j) dp[i][j] += dp[i-1][j]; dp[i][j] %= MOD; //计算过程模2020,防止溢出 } } printf("%d\\n", dp[2020][1010]); return 0;} H 走方格 【问题描述】 在平面上有一些二维的点阵。 这些点的编号就像二维数组的编号一样,从上到下依次为第 1 至第 n 行, 从左到右依次为第 1 至第 m 列,每一个点可以用行号和列号来表示。 现在有个人站在第 1 行第 1 列,要走到第 n 行第 m 列。只能向右或者向下 走。 注意,如果行号和列数都是偶数,不能走入这一格中。 问有多少种方案。 【输入格式】 输入一行包含两个整数 n, m。 【输出格式】 输出一个整数,表示答案。 【样例输入】 3 4 【样例输出】 2 【样例输入】 6 6 【样例输出】 0 【评测用例规模与约定】 对于所有评测用例,1 ≤ n ≤ 30, 1 ≤ m ≤ 30。 【标签】动态规划 【思路】 求方案数最容易想到深搜,但运行程序后输入较大的数据会发现深搜超时,可以改用动态规划。 由于只能向下或向右走,可知到达i行j列必定是从i-1向下走或从j-1向右走,所以到达i行j列的方案数就是到达i-1行j列的方案数+到达i行j-1列的方案数。 123456789101112131415161718192021222324#include<cstdio>#include<iostream>using namespace std;const int mx = 30+5;int dp[mx][mx];int main(){ int n, m; scanf("%d%d", &n, &m); for(int i = 1; i <= n; i++){ for(int j = 1; j <= m; j++){ if(i==1 || j==1){ dp[i][j] = 1; continue; } if(i&1 || j&1){ //x&1若为1,说明是奇数。因为x的二进制最后一位为1 dp[i][j] = dp[i-1][j] + dp[i][j-1]; } } } printf("%d\\n", dp[n][m]); return 0;} J 网络分析 【问题描述】 小明正在做一个网络实验。 他设置了 n 台电脑,称为节点,用于收发和存储数据。 初始时,所有节点都是独立的,不存在任何连接。 小明可以通过网线将两个节点连接起来,连接后两个节点就可以互相通信 了。两个节点如果存在网线连接,称为相邻。 小明有时会测试当时的网络,他会在某个节点发送一条信息,信息会发送 到每个相邻的节点,之后这些节点又会转发到自己相邻的节点,直到所有直接 或间接相邻的节点都收到了信息。所有发送和接收的节点都会将信息存储下来。 一条信息只存储一次。 给出小明连接和测试的过程,请计算出每个节点存储信息的大小。 【输入格式】 输入的第一行包含两个整数 n, m,分别表示节点数量和操作数量。节点从 1 至 n 编号。 接下来 m 行,每行三个整数,表示一个操作。 如果操作为 1 a b*,表示将节点 *a 和节点 b 通过网线连接起来。当 a = b 时,表示连接了一个自环,对网络没有实质影响。 如果操作为 2 p t*,表示在节点 *p 上发送一条大小为 t 的信息。 【输出格式】 输出一行,包含 n 个整数,相邻整数之间用一个空格分割,依次表示进行 完上述操作后节点 1 至节点 n 上存储信息的大小。 【样例输入】 4 8 1 1 2 2 1 10 2 3 5 1 4 1 2 2 2 1 1 2 1 2 4 2 2 1 【样例输出】 13 13 5 3 【评测用例规模与约定】 对于 30% 的评测用例,1 ≤ n ≤ 20,1 ≤ m ≤ 100。 对于 50% 的评测用例,1 ≤ n ≤ 100,1 ≤ m ≤ 1000。 对于 70% 的评测用例,1 ≤ n ≤ 1000,1 ≤ m ≤ 10000。 对于所有评测用例,1 ≤ n ≤ 10000,1 ≤ m ≤ 100000,1 ≤ t ≤ 100。 【标签】并查集 【思路】 1、连接x和y:判断被连接的2点是否已属于某一连通块,分4种情况 (1)x和y均未加入连通块:x和y均加入编号为x的连通块 (2)x未加入连通块,y已加入:将x加入y所在连通块 (3)x已加入连通块,y未加入:将y加入x所在连通块 (4)x和y均已加入连通块:合并2个连通块。具体操作:在x和y各自所在的两个连通块中选编号小的连通块,记为tmin,编号大的那个连通块记为tmax。遍历所有站点,其中属于tmax连通块的站点均更新其所在连通块为tmin,达到合并2个连通块的目的 2、从x发送大小为y的信息:x站点首先加上y,然后遍历所有站点,和x属于同一连通块的均加上y 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152#include<cstdio>#include<queue>#include<algorithm>#include<cstring>using namespace std;const int mx = 10000+10;int sum[mx], father[mx];int main(){ //输入 int n, m; scanf("%d%d", &n, &m); memset(father, 0, sizeof(father)); memset(sum, 0, sizeof(sum)); //边输入边操作 while(m--){ int op, x, y; scanf("%d%d%d", &op,&x,&y); if(op == 1){ //连接x,y点 if(!father[x] && !father[y]) father[x] = x, father[y] = father[x]; else if(!father[x] && father[y]) father[x] = father[y]; else if(father[x] && !father[y]) father[y] = father[x]; else{ int tmax = max(father[x], father[y]); int tmin = min(father[x], father[y]); for(int i = 1; i <= n; i++) if(father[i] == tmax) father[i] = tmin; } }else{ //站点x发送大小为y的信息 /* 下面先把x站点加上y,是因为下面的if语句中"&& father[x]" 保证了x绝对属于某一连通块。此处若不先将x自身加上y, 当x是一个孤立点、即不属于任一连通块时会导致x没有加上 y,最终输出x点存储的信息大小时比正确答案小 */ sum[x] += y; for(int i = 1; i <= n; i++) //站点x已经加过,因此i==x时不必再加一次 && //i和x属同一连通块 && father[x]是属于某一连通块的 if(i != x && father[i] == father[x] && father[x]) sum[i] += y; } } //输出 for(int i = 1; i <= n; i++){ if(i != 1) printf(" "); printf("%d", sum[i]); } printf("\\n"); return 0;}","categories":[],"tags":[]},{"title":"LeetCode-贪心算法","slug":"LeetCode-贪心算法","date":"2020-09-26T15:33:42.000Z","updated":"2020-09-26T15:33:42.702Z","comments":true,"path":"2020/09/26/LeetCode-贪心算法/","link":"","permalink":"https://hisami.gitee.io/2020/09/26/LeetCode-%E8%B4%AA%E5%BF%83%E7%AE%97%E6%B3%95/","excerpt":"","text":"","categories":[],"tags":[]},{"title":"《算法竞赛入门经典第2版》学习笔记","slug":"《算法竞赛入门经典第2版》学习笔记","date":"2020-08-18T08:15:24.000Z","updated":"2020-10-28T06:23:19.119Z","comments":true,"path":"2020/08/18/《算法竞赛入门经典第2版》学习笔记/","link":"","permalink":"https://hisami.gitee.io/2020/08/18/%E3%80%8A%E7%AE%97%E6%B3%95%E7%AB%9E%E8%B5%9B%E5%85%A5%E9%97%A8%E7%BB%8F%E5%85%B8%E7%AC%AC2%E7%89%88%E3%80%8B%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/","excerpt":"","text":"小技巧/细节篇 1.取数值n的末6位:可以写成n % 1e6 2.多组测试数据:while(scanf(“%d”, &n)==1 && n),表示输入1个变量(这里指n)且n不为0,则进入循环体。若需输入2个变量则修改为while(scanf(“%d %d”, &a, &b)==2 && (进入循环体的条件)) 3.x四舍五入:floor(x+0.5) 4.do-while循环格式“do{循环体}while(条件);”,其中循环体至少执行一次 5.比较大的数组声明在main函数外,否则可能无法运行 6.输出格式空格问题:除了头一个字符其余字符前面带空格: 1234for(int i = 0; i < n; i++){ if(i > 0) printf(" "); printf("%c", ch);} 7.多利用C++语言的简洁性。比如 ①tot和a [0] [n-1]都赋值1,x是行,y是列。可写成”tot = a[x=0] [y=n-1] = 1;” ②行+1的同时tot+1,可写成”a[++x] [y] = ++tot;” PS:注意前自增++tot和后自增tot++的区别! 8.scanf输入不包含空格和回车,当输入需要包含空格或回车时采用getchar。用法: 1234567int c; //注意必须使用int定义字符,避免出错c = getchar();//循环读入:int c;while( (c = getchar()) != EOF){ ... ...} eg. 12345678910111213#include<cstdio>#include<iostream>using namespace std;char s[] = "`123456789-=QWERTYUIOPASDFGHJKLZXCVBNM,./";int main(){ int i, c; while((c = getchar()) != EOF){ for(i = 1; s[i] && s[i] != c; i++); if(s[i]) putchar(s[i-1]); else putchar(c); } return 0;} PS:调用getchar时,用户输入的字符被暂时存放在键盘缓冲区,直到用户按回车为止(回车字符也放在缓冲区)。键入回车之后,getchar才开始从stdin流中每次读入一个字,每读取一个字符就处理一个字符,再用putchar输出这单个字符。 9. 数组篇 通用 1.从数组a复制k个元素到数组b:memcpy(b, a, sizeof(数组类型)*k),头文件< cstring > 2.定义常量数组无需指明大小,如char[] = “abcd” 整型/bool型 1.数组清零:memset(a, 0, sizeof(a)),头文件< cstring > 字符数组 1.用scanf输入字符数组:scanf(“%s”, s),不用加& 2.sprintf:输出到字符数组。用法:将a、b、c变量输出到buf串写作 sprintf(buf, “%d%d%d”, a, b, c),但须保证buf足够大,至少是输出字符的个数加1(因为末尾还有看不见的’\\0’),才可以容纳输出的信息 3.字符数组的复制:strcpy(a, b)—将b串复制到a串 字符数组的比较:strcmp(a, b)—a < b返回负数,a == b返回0, a > b返回整数。PS:比较是自左向右按ASCII码值升序比较 字符数组的连接:strcat(c, d)—在c串后面接上d串 字符数组匹配查找:strchr(s, ‘,’)—在s串查找逗号第一次出现的位置下标 12345678910111213#include<cstdio>#include<iostream>#include<cstring>using namespace std;int main(){ char a[20], b[20]; scanf("%s", a); strcpy(b, a); //将a复制到b if(strcmp(a, b) == 0) cout << "Equal.\\n"; //比较a和b strcat(a, b); //将b接到a后面 printf("%s", a); return 0;} 文件篇 1.文件重定向:将.in文件作为输入,输出到.out文件中。将重定向语句写在#ifdef和#endif中,仅当定义了LOCAL符号,才编译2条freopen语句。将#define LOCAL注释掉,即可变成标准I/O(即键盘输入控制台显示输出结果)PS:编译前将测试数据保存在.in文件。 eg. 123456789101112131415161718#define LOCAL#include<cstdio>#define INF 1000000000int main(){ #ifdef LOCAL freopen("data.in", "r", stdin); freopen("data.out", "w", stdout); #endif int x, n = 0, min = INF, max = -INF, s = 0; while(scanf("%d", &x)==1){ s += x; if(x < min) min = x; if(x > max) max = x; n++; } printf("%d %d %.3f\\n", min, max, (double)s/n); return 0;} 2.文件读写:声明变量fin,fout,scanf改为fscanf,第一个参数为fin,printf改为fprintf,第一个参数为fout,最后执行fclose eg. 123456789101112131415161718#include<cstdio>#define INF 1000000000int main(){ FILE *fin, *fout; fin = fopen("data.in", "rb"); //rb:以可读写打开一个文件 fout = fopen("data.out", "wb"); //wb:以只写打开/新建一个文件 int n, x, min = INF, max = -INF, s = 0; while(fscanf(fin, "%d", &x)==1){ s += x; if(x < min) min = x; if(x > max) max = x; n++; } fprintf(fout, "%d %d %.3f\\n", min, max, (double)s/n); fclose(fin); fclose(fout); return 0;} 番外篇 1.用头文件#include计算运行时间,clock()函数是时钟周期计数(机器时钟每秒所走的时钟打点数),用(double)clock() / CLOCKS_PER_SEC得到的才是以秒为单位的时间。 eg.计算S = 1!+2!+…+20!的末6位,观察运行时间 123456789101112131415#include<iostream>#include<ctime>using namespace std;const int MOD = 1000000;int main(){ int n = 20, sum = 0; for(int i = 1; j <= n; i++) { int t = 1; for(int j = 1; j <= i; j++) t = (t * j) % MOD; sum = (sum + t) % MOD; } printf("%d\\n", sum % MOD); printf("Time used: %f\\n", (double)clock() / CLOCKS_PER_SEC); return 0;} 运行结果: 820313 Time used : 0.001000","categories":[{"name":"算法学习笔记","slug":"算法学习笔记","permalink":"https://hisami.gitee.io/categories/%E7%AE%97%E6%B3%95%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"}],"tags":[{"name":"数据结构与算法","slug":"数据结构与算法","permalink":"https://hisami.gitee.io/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/"}],"author":"hisami"},{"title":"Hello World","slug":"hello-world","date":"2020-07-08T06:26:40.180Z","updated":"2020-07-08T06:26:40.180Z","comments":true,"path":"2020/07/08/hello-world/","link":"","permalink":"https://hisami.gitee.io/2020/07/08/hello-world/","excerpt":"","text":"Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub. Quick Start Create a new post 1$ hexo new "My New Post" More info: Writing Run server 1$ hexo server More info: Server Generate static files 1$ hexo generate More info: Generating Deploy to remote sites 1$ hexo deploy More info: Deployment","categories":[],"tags":[]}],"categories":[{"name":"课程设计","slug":"课程设计","permalink":"https://hisami.gitee.io/categories/%E8%AF%BE%E7%A8%8B%E8%AE%BE%E8%AE%A1/"},{"name":"算法学习笔记","slug":"算法学习笔记","permalink":"https://hisami.gitee.io/categories/%E7%AE%97%E6%B3%95%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"}],"tags":[{"name":"python","slug":"python","permalink":"https://hisami.gitee.io/tags/python/"},{"name":"数据结构与算法","slug":"数据结构与算法","permalink":"https://hisami.gitee.io/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/"}]}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/hisami/hisami.git
git@gitee.com:hisami/hisami.git
hisami
hisami
Hisami
master

搜索帮助

344bd9b3 5694891 D2dac590 5694891