「学习笔记」3.23代码学习

Posted stars_cj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了「学习笔记」3.23代码学习相关的知识,希望对你有一定的参考价值。

老师这两天给留了一道题,研究了几天,也没写出来,想想可能太难了,还是先刷简单的题吧。
老师留的题目是这样的:若干个城市,找到其中m个点,这m个点的特征是,所有的城市都可以到这m个点中距离自己最近的点距离小于a,找到这样的m个点。这种题目类似于几个城市中寻找物流点。
主要思路是考虑从最小生成树开始,这m个点是最小生成树中的某几个结点。后来老师可能觉得有点难度,让我先把最小生成树写出来,然后……然后……我就写不出来了。网上源码很多,想要自己写,最小生成树主要是有两个算法,prime,kruscal,这两个算法是很好理解,但是我在用python实现的时候总感觉思路理不清,这也是我现在写代码最困难的,就是思路不清。
下面是我憋了两天写的,但是不对,我暂时放弃了,过几天再回过头来看。

#encoding:utf8

import numpy as np

#输入
# vertex=raw_input().split(' ')    #定义图的顶点,输入格式0 1 2 3 4 5……顶点相当于矩阵下标或是矩阵索引
# graph_weight=[]               #定义图的邻接矩阵   图的邻接矩阵未相邻的点及对角线的值均为0
# for i in range(0,len(vertex)):
#     graph_weight.append(raw_input().split(' '))    #输入格式矩阵一行之间用空格分格,换列回车  取得邻接矩阵
# graph_weight=np.array(graph_weight,dtype=int)    #输入时解释为str,此处将其更改为int

#定义prime算法
def prime(graph_weight):
    vertex=map(str,range(0,len(graph_weight)))   #定义图的顶点,顶点为string
    print 'vertex:' vertex
    vertex_tree=vertex[0]        #定义最小生成树顶点集合,从0开始矩阵下标
    print 'vertex_tree:' vertex_tree
    graph_weight_tree=[]        #定义最小生成树邻接矩阵,prime算法是从任意点出发,此算法定义从0点出发
    while not(vertex_tree==vertex):          #最小生成树遍历所有顶点后结束循环
        for i in range(0,len(vertex_tree)):
            for j in range(0,len(vertex)):
                #if graph_weight[i][j]>0:
                min_weight=min(graph_weight[i])  #min(graph_weight[i]) 取与第i个顶点相邻的所有顶点中的最小值
                graph_weight_index=graph_weight.index(min_weight)  #graph_weight.index()取第i个点与其相邻结点中最小值的索引
                vertex_tree.append(graph_weight_index)    #vertex_tree.append()将其最小值的邻接点加入最小生成树的顶点中
                graph_weight_tree[j][graph_weight_index]=min_weight #将权值加入到最小生成树的矩阵里
            min_weight=0  #在原邻接矩阵中将取出的最小值置为0

    return graph_weight_tree

l1=[0,6,1,5,0,0]
l2=[0,0,5,0,0,0]
l3=[0,0,0,5,6,4]
l4=[0,0,0,0,5,2]
l5=[0,0,0,0,0,6]
l6=[0,0,0,0,0,0]

l=[l1,l2,l3,l4,l5,l6]
print prime(l)

继续刷acmcoder上的题
2023 平均成绩

#encoding:utf8
#求平均成绩

##思路:
##正式答案
import numpy as np
l1=raw_input('请输入学生数量和课程数量: ').split(' ')
l1=map(int,l1)
l2=[]
for i in range(0,l1[0]):
    l2.append(raw_input().split(' '))
l2=np.array(l2,dtype=int)

student_avg=np.average(l2,axis=1)
course_avg=np.average(l2,axis=0)
print l2
print course_avg
comp=l2>=course_avg
#print comp
print len(filter(lambda x:x.all(),comp))


##寻找思路所写
# l1=raw_input('请输入学生数量和课程数量: ').split(' ')
# l1=map(int,l1)
# l2=[]
# for i in range(0,l1[0]):
#     l2.append(raw_input().split(' '))
# #l2=np.array(l2,dtype=int)

#print l2

# student_avg=np.sum(l2,axis=1,dtype=float)/l1[0]
# #print student_avg
# course_avg=np.sum(l2,axis=0,dtype=float)/l1[1]
# #print course_avg
# #我想将学生成绩与课程成绩做差,然后找到矩阵中行大于0的,再计数,但是比较麻烦,可以直接比较
# l3=l2-course_avg
# print l3




# l1=[2,2]
# l2=np.array([[2,3],[4,5]])
# student_avg=np.average(l2,axis=1)
# course_avg=np.average(l2,axis=0)
# print l2
# print course_avg
# comp=l2>=course_avg
# print comp
# print len(filter(lambda x:x.all(),comp))

##之前就是不知道该怎么将矩阵的行相加或列相加,才找的numpy这个库,但是觉得这个循环还是应该要知道,
##又重新考虑如何表示
l1=[2,2]
l2=np.array([[2,3],[4,5]])
l3=[] #行相加
sum=l2[0][0]
for i in range(0,l1[0]):
    sum=0       #每次sum求完之后要归零,要不会一直加
    for j in range(0,l1[1]):
        sum=sum+l2[i][j]
    l3.append(sum)
print l3
l4=[]  #列相加
for i in range(0,l1[1]):
    sum=0
    for j in range(0,l1[0]):
        sum=sum+l2[j][i]   #列相加需要注意i,j的位置
    l4.append(sum)
print l4

2025 查找最大元素

#encoding:utf8
#查找最大元素

##思路:python可以直接对字母进行比较,所以考虑是逐一比较,出现最大的加(max)
##首先找到最大值 ,然后想怎么能够在最大值后面加(max),找到个函数insert(index,插入内容),再考虑
##index(要找到的))这个函数,是找到元素所在的位置,但是这时候出现问题了,这里的index()只取了第一个
##最大值的位置,但题目要求将所有的最大值后面都要加(max)
##后来又考虑用替换的函数replace()


##正式答案
s=raw_input()
max_str=s[0]

for i in s:
    if i>=max_str:
        max_str=i

print s.replace(max_str,max_str+'(max)')







##v如下为寻找思路所写
#s=list(raw_input())
# s='xxxxx'
# s=list(s)
# # print s.index('c')
# # s.insert(s.index('c'),'(max)')
#
# max_str=s[0]
# #
# # for i in s:
# #     if i>=max_str:
# #         max_str=i
# for i in enumerate(s):
#     if i>=max_str:
#         max_str=i
# print max_str

#print s.index(max_str)


#
# print s.replace(max_str,max_str+'(max)')
#s.insert(s.index(max_str)+1,'(max)')

#print s

2026首字母大写

#encoding:utf8
#首字母变大写

l=raw_input()
l=l.split(' ')

#l=['i','like','acm']
s=[]
for i in l:
    s.append(i.capitalize())  #str.capitalize()要注意是对str首字母大写

s=' '.join(s)    #将s中的元素以空格合并
print s

2027统计元音

#encoding:utf8
##统计元音

##目前存在的问题:
##1\\题意要求最后一组计数出来不输出空格,以下代码输出还是有空格。3.23
##2\\按测试出来结果有一个字母o计数不对,第二组测试实例o应为0,以下代码输出为1  3.23

n=int(raw_input())            #输入测试实例个数
l=[]
for i in range(0,n):       #分行输入测试实例
    l.append(raw_input())

#测试给定输入
# n=2
# l=['aeiou','my name is ignatius']

vowel=['a','e','i','o','u']
#思路1:对列表中所有字母计数,输出元音字母数字
str_num=              #定义对所有元素计数的字典
for i in l:             #在l中每一个字符串i循环
    for j in i:          #在字符串i中对每一个元素j循环
        str_num[j]=i.count(j)       #对元素j计数,并加入str_num中
    for k in vowel:
        vowel_num=str_num[k]       #在str_num中找到vowel中的元音字母的值,赋给vowel_num

        print k,':',vowel_num
    print '\\n'


#统计元音   还没做完 做不出来了   以下写的时间为3.21
##思路1:创建字典,字典键值为元音,如果输入元素的值等于字典的key,则计数+1,最后输出字典,对于输入
##的list中的元素如何一一与字典只的键值做比较,在循环时发生字典键值不能迭代的问题
# def count_vowel(l):
#     vowel=['a','e','i','o','u']
#     vowel_num=.fromkeys(vowel)
#     count=0
#     for i in l:
#         if i in vowel_num:
#             count+=1
#         vowel_num[i]=count
#
#     return vowel_num


# l1=list('aeiou')
# l2=list('my name is ignatius')
# s=[l1,l2]

##思路2:将输入list所有字母计数,输出其中元音字母的重复次数
##思路21 库函数计数
# from collections import Counter
# for i in s:
#     print Counter(i)

##思路22 字典计数
# def count_num(l):
#     countnum=
#     for i in l:
#         if l.count(i)>=1:
#             countnum[i]=l.count(i)
#     return countnum
#
# count_vowel=[]
# vowel=['a','e','i','o','u']
# for l in s:
#     for i in vowel:
#         count_vowel.append(count_num(l).get(i))
#     print count_vowel



##输入
# n=int(raw_input())
# l=[]
# for i in range(0,n):
#     s=list(raw_input())
#     l.extend([s])




#先不考虑输入格式
# n=2
# l=['a','e','i','o','u']
# l1=list('aeiou')
# l2=list('my name is ignatius')
# s=[l1,l2]
# print s
# for i in range(0,len(s)):
#     for j in range

1108求最小公倍数

#encoding:utf8
##求最小公倍数

##先求最大公约数
def gcd(x,y):
    if x%y==0:
        return y
    else:
        return gcd(y,x%y)

#print gcd(18,10)

def Lowest_Common_Multiple(x,y):
    return x*y/gcd(x,y)

print Lowest_Common_Multiple(10,18)

1166 敌兵布阵

#encoding:utf8
##敌兵布阵

##问题1:未加入人数判断条件
import math
command=[]
t=len(command)      #t tiao ming ling
T=int(raw_input())    #共T组数据
for i in range(0,T):   #
    N=int(raw_input())        #每组共有N个工兵营地
    a=map(int,raw_input().split(' '))  #每个工兵营地的人数 例 1 2 3 4  #这里人数要求1<=ai<=50
    # print 'Case',T,':'
    while t<=40000 :
        command=raw_input().split(' ')
        if command=='End':
            break
        else:
            i=int(command[1])-1       #第i个营地,此处用-1是因为列表是从0开始计,i不超过30
            j=int(command[2])        #j不超过30
            if command[0]=='Query':
                print sum(a[i:j])
            elif command[0]=='Add':
                a[i]=a[i]+j        #第i个营地增加j个人
            elif command[0]=='Sub':
                a[i]=a[i]-j
            else:
                break

以上是关于「学习笔记」3.23代码学习的主要内容,如果未能解决你的问题,请参考以下文章

赖世雄音标读书笔记 + 元音总结

养乐多老师2017版韩语发音教程学习笔记

python基础学习笔记

3.23linux内核编译学习

3.23

大唐杯备考——5G网络架构的演进趋势(学习笔记)