算法入门刷题笔记 算法竞赛入门经典第三章习题思路

写在前面

好久没更新公众号和博客了,因为最近在研究新的方向,所以很少发文。
笔者接触编程只有一年,这一年间主要研究启发式算法在运筹学中的应用。但是由于编程基础薄弱,在进一步研究复杂运筹学问题时发现基础算法不过关导致写出的代码运行速度很慢,因此很苦恼。所以决定这个暑假补习一下基础算法,主要是刷一些简单的ACM入门题。偶尔会发一些刷题笔记(偶尔!)。和作者有类似目标的同学可以一起交流共勉!

目前在看的教程:
北京理工大学ACM冬季培训课程

算法竞赛入门经典/刘汝佳编著.-2版可以在这里下载->github

课程刷题点
Virtual Judge

刷题代码都会放在github上,欢迎一起学习进步!

今天主要干正事去了,简单看了下课本的前五章,想做点习题但是太多了一点,就简单写下思路(用python && C++ && 伪代码的形式,嘻嘻)。写了一章左右,题目实在有点多,明天看看要不再挑着写一点,然后看看课程第二讲,再写Day2的习题。

第三章习题思路

第三章习题思路

在这里插入图片描述

str = input()
int count = 1
int sum = 0
for char in str:
	if char == 'O' : sum += count ++
print(sum)

在这里插入图片描述

molecule = input()
map<char, int> table
table = input()
sum = 0
for atom in molecule:
	if atom in map : sum += map.find(atom).second
print(sum)

mark一下map我还不会用(虽然经常见或者读,在java里),下次试一下。下次一定~

在这里插入图片描述

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

在这里插入图片描述

一开始把题目看成***找出所有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)

在这里插入图片描述

类似前面那个找循环的字符串吧,但这里要保证是一个循环小数呀,不然一直查下去…

a, b = input
vector<int> decimals
i = 0
while(true)
	char = decimals[i]
	if char = decimals[0]:
		j = decimals.length
		while(j < i * 2)
			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++

在这里插入图片描述

前两天Day1里做过,跳过了。

在这里插入图片描述

我仔细一想,长方体只能有长宽高,那只要判断输入的数字是否只有3个就好了吧?

欢迎打脸。。。如果是这样就不写了。。。

在这里插入图片描述

就简单写一个暴力好了,不知道会不会TL。。。

str1, str2 = input

for i in range(str1):
	for j in range(str2):
		if str1[i] + str2[j] > 2: break

在这里插入图片描述

没看懂题面,不做了不做了~

后记

随便写不用上交不用debug的感觉可真好…咳咳,但是这样学不到东西,以后还是老老实实刷题吧…下次还是写规范的伪代码吧,写混着写了,这样玩没啥效果…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值