算法学习(九)

1.Parity Control

说明:安娜住在阿尔戈尔,鲍勃住在贝蒂格里。因为这些恒星位于不同的星座-英仙和猎户座,所以它们之间的距离很遥远。他们找到了一种通过电子邮件进行交流的方式。

然而,由于距离很远,在传输过程中可能会改变一些字母。简单形式的错误检查是由安娜提出的:所有的字母都以通常的ASCII码传输,每个符号一个字节。每个字节由8位组成,但最高位不用于英语语言,通常是0。

让我们将这个位设置为0或1,以便整个字节中的‘1’位的总和永远是偶数(2、4、6或8),下面是一些字母编码的方式:

symbol     ascii-code     binary     num-of-bits    encoded-binary   encoded-dec

 ‘A‘           65        01000001         2            01000001           65
 ‘B‘           66        01000010         2            01000010           66
 ‘C‘           67        01000011         3            11000011          195
 ‘.‘           46        00101110         4            00101110           46
 ‘ ‘           32        00100000         1            10100000          160

通信线路在每个传输字节中都不能改变一个多一点。因此,有奇数‘1’位的字节被认为是损坏的。

我们在得到这个受保护的编码中的消息。我们的任务是检查每个字母并移除那些损坏的字母。其他的应该被转换成普通的ASCII,并作为字符打印。

输入数据:将包含所传输的消息的字节(由十进制值的序列表示,与空格分隔)。

原始信息仅包含拉丁字母(小和大写)、数字和空格。

消息的结尾是由点字符表示的。-你可以假设这永远不会被破坏。

答案:去掉被删除的字节的消息,并且表示为字符而不是数字。

例如:

input data:
65 238 236 225 46

answer:
Ana.

分析:输入数据中,先用bin()转化为二进制,在格式化encoded-binary,不够8位的通过zfill(8)补足8位数,用count(‘1’)计算‘1’的总数,是奇数时为损坏字符应去掉。

然后把第一位是‘1’的换为‘0’,在用int(str,2)转化为ascii-code,最后转化为字符。当第一位是‘0’时,直接用encoded-dec转化为字符。

测试数据:

72 120 226 75 160 246 168 244 119 207 226 48 224 116 101 160 121 53 215 230 182 173 250 212 65 51 115 121 180 160 178 54 234 103 89 26 243 119 228 162 102 160 108 57 197 68 240 160 78 64 186 237 160 160 210 71 107 235 57 78 77 105 230 113 231 116 160 196 226 107 193 225 205 160 81 238 209 197 16 82 127 215 216 185 160 114 80 57 119 240 160 85 51 111 202 195 119 160 233 181 46

代码如下:

 1 data = input().split(‘ ‘)
 2 msg_lsit = []
 3
 4 for i in data:
 5     string = bin(int(i))[2:]  # 去掉前缀Ob
 6     if string.count(‘1‘) % 2 != 0:  # 当1的位数是奇数时,数据错误,去掉
 7         continue
 8     elif string.count(‘1‘) % 2 == 0:  # 1的位数是偶数
 9         string = string.zfill(8)   # 填满8位数
10
11         if string[0] == ‘0‘:   # 当第一位是0时,直接转换为字符
12             msg = chr(int(i))
13             msg_lsit.append(msg)
14         if string[0] == ‘1‘:   # 当第一位是1时,先转换为ascii-code,在转换为字符
15             new_string = ‘0‘ + string[1:]
16             msg = chr(int(new_string, 2))
17             msg_lsit.append(msg)
18 print(‘‘.join(msg_lsit))
19
20 输出:HxbK vwOb0te 5WzTA34 26Yswdf l9EDp Nm  RGk9NMiqgt ba nQEWX rP9wp U3oJCw .

2.Quadratic Equation(二次方程式)

说明:现在我们要创建一个解二次方程的程序。

A * x^2 + B * x + C = 0

A,B和C是一些常数(方程的“系数”)x是一个变量,找到x的正确的解,例如,系数3,-5和-2,我们有方程:

3 * x^2 - 5 * x - 2 = 0

我们可以看到,x=2的值是相当合适的。

通过方程的系数找到这些值(或“根”)的一般公式如下:

x1 = (-B + sqrt(B^2 - 4*A*C)) / (2*A)
x2 = (-B - sqrt(B^2 - 4*A*C)) / (2*A)

例如,以上这些表达式将产生:

x1 = (5 + sqrt(5^2 + 4*3*2)) / (2*3) = (5 + 7) / 6 = 2
x2 = (5 - sqrt(5^2 + 4*3*2)) / (2*3) = (5 - 7) / 6 = -1/3

也就是说,这个方程有两个根。严格地说,这里总是有两个根。并且可以求解复数,当i=sqrt(-1)时。

输入数据:第一行中包含测试用例数。

每个测试用例都包含三个值(分别为A、B和C)。

答案:应该包含两个根的根(即使它们是相等的)。使用空格分隔这对组合的值,并使用分号来分隔对对。复数应该是5-2i或-1+1。

还请注意:
  这对中值的顺序是很重要的——对于真正的根来说,首先输出的是更大的;对于复杂的根,输出a+bi和a-bi;

   在这个任务中,根总是用整数表示,所以不要打印任何小数点。

例如:

input data:
3
3 -3 -6
1 0 1
9 90 225

answer:
2 -1; 0+1i 0-1i; -5 -5

测试数据:

16
6 0 -216
2 -18 16
7 70 427
9 -162 720
5 30 90
1 4 68
9 -90 189
2 -20 48
8 64 -72
8 -160 1088
2 32 130
9 90 81
3 -30 123
9 144 1305
8 40 -400
7 -84 595

代码如下:

 1 tast_cases = int(input())  # 测试用例数
 2
 3 import math  # 导入math模块,需要用到sqrt模块
 4 for i in range(tast_cases):
 5     data = input().split()
 6     A = int(data[0])
 7     B = int(data[1])
 8     C = int(data[2])
 9     M = B**2 - 4*A*C
10     if M >= 0:
11         X1 = round((math.sqrt(M) - B) / (2*A))
12         X2 = round((-math.sqrt(M) - B)/ (2*A))
13     else:
14         if round(math.sqrt(abs(M)) / (2*A)) > 0:
15             X1 = ‘{}+{}i‘.format(round(-B /(2*A)), round(math.sqrt(abs(M)) / (2*A)))
16             X2 = ‘{}{}i‘.format(round(-B /(2*A)), round(-math.sqrt(abs(M)) / (2*A)))
17         else:
18             X1 = ‘{}{}i‘.format(round(-B / (2 * A)), round(math.sqrt(abs(M)) / (2 * A)))
19             X2 = ‘{}+{}i‘.format(round(-B / (2 * A)), round(-math.sqrt(abs(M)) / (2 * A)))
20     print((‘{} {}‘.format(X1, X2)), end=‘;‘)
21
22 输出:6 -6; 8 1; -5+6i -5-6i; 10 8; -3+3i -3-3i; -2+8i -2-8i; 7 3; 6 4; 1 -9; 10+6i 10-6i; -8+1i -8-1i; -1 -9; 5+4i 5-4i; -8+9i -8-9i; 5 -10; 6+7i 6-7i;
时间: 2024-10-13 16:18:22

算法学习(九)的相关文章

算法学习笔记

对于一个软件人员来说,算法和数据结构是无法逃避的,越是逃避说明越是需要继续学习和巩固.加深.转载一篇github上有关算法的文章,以便于进行继续学习和理解.当然并不是说非得全部掌握所有算法至少达到需要的时候会找,找到了会使,使完了能明白是什么东西才能更好的进行coding.这篇文章是有关C的 下次再弄个Java语言的算法部分.学无止境嘛,不能光看java也要学习学习C 学习方法 把所有经典算法写一遍 看算法有关源码 加入算法学习社区,相互鼓励学习 看经典书籍 刷题 原文地址:https://gi

算法学习 - 表达树的建立(后缀表达式法),树的先序遍历,中序遍历,后序遍历

表达树就是根据后缀表达式来建立一个二叉树. 这个二叉树的每个叶子节点就是数,真祖先都是操作符. 通过栈来建立的,所以这里也会有很多栈的操作. 树的先序遍历,中序遍历,后序遍历的概念我就不讲了,不会的自行百度,不然也看不懂我的代码. 下面是代码: // // main.cpp // expressionTree // // Created by Alps on 14-7-29. // Copyright (c) 2014年 chen. All rights reserved. // #includ

我的算法学习之路

关于 严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口--况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以我认为本文题目是合理的. 这篇文章讲了什么? 我这些年学习数据结构和算法的总结. 一些不错的算法书籍和教程. 算法的重要性. 初学 第一次接触数据结构是在大二下学期的数据结构课程.然而这门课程并没有让我入门--当时自己正忙于倒卖各种MP3和耳机,对于这些课程根本就不屑一顾--反正最后考试划个重点也能过,于是这门整个计算机专业本

算法学习三阶段

?? 第一阶段:练经典经常使用算法,以下的每一个算法给我打上十到二十遍,同一时候自己精简代码, 由于太经常使用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都能够把程序打 出来. 1.最短路(Floyd.Dijstra,BellmanFord) 2.最小生成树(先写个prim,kruscal 要用并查集,不好写) 3.大数(高精度)加减乘除 4.二分查找. (代码可在五行以内) 5.叉乘.判线段相交.然后写个凸包. 6.BFS.DFS,同一时候熟练hash 表(要熟,要灵活,代码要

周总结(2017.2.16):第一周算法学习。

周总结:算法学习总结之DFS和BFS 一:DFS算法 目的:达到被搜索结构的叶节点. 定义:假定给定图G的初态是所有的定点都没有访问过,在G中任选一定点V为初始出发点,首先访问出发点并标记,然后依次从V出发搜索V的每个相邻点W,若W未曾出现过,则对W进行深度优先遍历(DFS),知道所有和V有路径相通的定点被访问. 如果从V0开始寻找一条长度为4的路径的话: 思路步骤: 先寻找V0的所有相邻点:dis{v1,v2,v3},V1没有访问过,所以对V1进行深度遍历并将V1标记为访问过,此时路径长度为1

算法学习 - 01背包问题(动态规划C++)

动态规划 01背包 问题描述 求解思路 代码实现 放入哪些物品 代码 动态规划 我在上一篇博客里已经讲了一点动态规划了,传送门:算法学习 - 动态规划(DP问题)(C++) 这里说一下,遇到动态规划应该如何去想,才能找到解决办法. 最主要的其实是要找状态转移的方程,例如上一篇博客里面,找的就是当前两条生产线的第i个station的最短时间和上一时刻的时间关系. minTime(station[1][i]) = minTime(station[1][i-1] + time[i], station[

LCA 算法学习 (最近公共祖先)poj 1330

poj1330 在求解最近公共祖先为问题上,用到的是Tarjan的思想,从根结点开始形成一棵深搜树,处理技巧就是在回溯到结点u的时候,u的子树已经遍历,这时候才把u结点放入合并集合中,这样u结点和所有u的子树中的结点的最近公共祖先就是u了,u和还未遍历的所有u的兄弟结点及子树中的最近公共祖先就是u的父亲结点.这样我们在对树深度遍历的时候就很自然的将树中的结点分成若干的集合,两个集合中的所属不同集合的任意一对顶点的公共祖先都是相同的,也就是说这两个集合的最近公共祖先只有一个.时间复杂度为O(n+q

算法学习 - 链表的游标实现~ C++

链表的游标实现,就是用另外一种方法来访问链表,模拟游标. 在我学习的理解中,就是创建一个节点数组,模拟内存的排列,然后从其中来申请内存和释放内存.但是实际的内存没有被释放~ 下面直接贴代码了: // // main.cpp // CursorList // // Created by Alps on 14-7-27. // Copyright (c) 2014年 chen. All rights reserved. // #include <iostream> #define CursorSp

最短路径算法学习总结

Dijkstra最短路径算法: dijkstra 算法的优点在于可以求出从一点到所有其他点的最短距离: input: 5 71 2 101 3 201 5 302 5 102 3 54 5 204 3 30 output: 0 10 15 40 20//这是求的在这颗树中,1到所有点的最短距离 1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 const int N=1100; 5 const int

Reinforcement Learning Q-learning 算法学习-2

在阅读了Q-learning 算法学习-1文章之后. 我分析了这个算法的本质. 算法本质个人分析. 1.算法的初始状态是随机的,所以每个初始状态都是随机的,所以每个初始状态出现的概率都一样的.如果训练的数量够多的 话,就每种路径都会走过.所以起始的Q(X,Y) 肯定是从目标的周围开始分散开来.也就是目标状态为中心的行为分数会最高. 如 Q(1,5)  Q(4,5)  Q(5,5)这样就可以得到第一级别的经验了.并且分数最高. Q(state, action) = R(state, action)