写在前面
好久没更新公众号和博客了,因为最近在研究新的方向,所以很少发文。笔者接触编程只有一年,这一年间主要研究启发式算法在运筹学中的应用。但是由于编程基础薄弱,在进一步研究复杂运筹学问题时发现基础算法不过关导致写出的代码运行速度很慢,因此很苦恼。所以决定这个暑假补习一下基础算法,主要是刷一些简单的ACM入门题。偶尔会发一些刷题笔记(偶尔!)。和作者有类似目标的同学可以一起交流共勉!
目前在看的教程:北京理工大学ACM冬季培训课程
算法竞赛入门经典/刘汝佳编著.-2版可以在这里下载->github
课程刷题点Virtual Judge
刷题代码都会放在github上,欢迎一起学习进步!
今天主要干正事去了,简单看了下课本的前五章,想做点习题但是太多了一点,就简单写下思路(用python && C++ && 伪代码的形式,嘻嘻)。写了一章左右,题目实在有点多,明天看看要不再挑着写一点,然后看看课程第二讲,再写Day2的习题。
第三章习题思路
第三章习题思路
![16def0ebc1c50b6b5bc49725a58ce02d.png](https://i-blog.csdnimg.cn/blog_migrate/dadfc1c939da2faeb1ecbfbd831ddbdd.png)
str = input()
int count = 1
int sum = 0
for char in str:
if char == 'O' : sum += count ++
print(sum)
![cdb02a7acfeec0ee47549432e5d75f21.png](https://i-blog.csdnimg.cn/blog_migrate/36e9900c6abaf23a321c169391a704cb.png)
molecule = input()
map table
table = input()
sum = 0for atom in molecule:if atom in map : sum += map.find(atom).secondprint(sum)
mark一下map我还不会用(虽然经常见或者读,在java里),下次试一下。下次一定~
![ad4b9f3b1c0b5a28f5152d6f576c812d.png](https://i-blog.csdnimg.cn/blog_migrate/b140cd8a821101ef11c6133c70f8a477.png)
str = input()
table[10]
memset(table, 0, sizeof(table))
for char in str:
table[char - '0']++
print(table)
之前看数据结构,好像看过一个算法叫KMP,感觉可能和这个有相似点?
问题说明肯定有循环,那么始终只要从第一个字母开始比较,只要查找和第一个字母相同的字母就好。
string str = input()
for i in range(str.length):
if char = str[0]:
if str.substr(0 to i - 1) == str.substr(i to i * 2 - 1)
print(i)
break
?都不知道这破题问的是什么,哪儿有问句啊喂喂喂???
网上一查,全都是和这个一样的描述,就放代码,你们都是语文小天才吗???
?也懒得去OJ上查了,看网上说是模拟,那就当是给字符串给出变化后的图吧。
operations[] = input
table[][] = input
x, y = find blank in table
for operation in operations[]:
if operation = 'A':
temp = table[x][y]
table[x][y] = table[x][y + 1]
table[x][y + 1] = temp
else if ......
print(table)
题目应该是给黑格白格要找横向单词和横向单词的坐标了。
table[r][c] = input
for block in table:
if block == black:
block down && block right are special
if block.pos is boundary:
block is special
for special in table form left to right:
if special.right is special and not AcrossBlock:
add special.right to Across
special.right is AcrossBlock
for special in table form up to down like above.
print Acorss and Down
![91e3c1c626677da3ed2fe66f237ea8cc.png](https://i-blog.csdnimg.cn/blog_migrate/41f5c3abd33afaf344927e902343579f.png)
一开始把题目看成***找出所有DNA序列中到其他序列H距离最短的DNA***,我一想还想不到啥好办法,结果上网一查是自己构造一个...那未免太DD了点吧...
DNAs[m] = input()
n = input()
char[4] = {'A', 'C, 'G, 'T'}
for i in range(n):
count[4] = {0, 0, 0, 0}
for DNA in DNAs[]:
if DNA[i] == char[0]: count[0]++;
else if DNA[i] == char[1]: count[1]++;
......
for max in count:
for smallest in char[max]
newDNA[i] = smallest
print(newDNA)
![19d53bafeb73879ab3358856e3a70c75.png](https://i-blog.csdnimg.cn/blog_migrate/00f49615ef10c9fcd64bd4117c7778e6.png)
类似前面那个找循环的字符串吧,但这里要保证是一个循环小数呀,不然一直查下去...
a, b = input
vector decimals
i = 0while(true)
char = decimals[i]if char = decimals[0]:
j = decimals.lengthwhile(j decimals.push_back((a / b * pow(10, ++j) % 10)if str.substr(0 to i - 1) == str.substr(i to i * 2 - 1)print(i)break
i++
![20809465b6606f0df72f085b80fd9013.png](https://i-blog.csdnimg.cn/blog_migrate/bf724e4f85fb23948beccad46164e62a.png)
前两天Day1里做过,跳过了。
![664ec3573a1055419b76d1c5cc6c57cd.png](https://i-blog.csdnimg.cn/blog_migrate/adcc4ba47179455bcd96772aa46c3873.png)
我仔细一想,长方体只能有长宽高,那只要判断输入的数字是否只有3个就好了吧?
欢迎打脸。。。如果是这样就不写了。。。
![e420d28bb975a76e83306fb9bbb6eeb7.png](https://i-blog.csdnimg.cn/blog_migrate/d478e7e6ae97957055eb86e094affc60.png)
就简单写一个暴力好了,不知道会不会TL。。。
str1, str2 = input
for i in range(str1):
for j in range(str2):
if str1[i] + str2[j] > 2: break
![5efe59528eef02e7ed3764bc0181c2e1.png](https://i-blog.csdnimg.cn/blog_migrate/5e81f4e92c0ea540954d6f4faf4a3f22.png)
没看懂题面,不做了不做了~
后记
随便写不用上交不用debug的感觉可真好......咳咳,但是这样学不到东西,以后还是老老实实刷题吧......下次还是写规范的伪代码吧,写混着写了,这样玩没啥效果......