「学习笔记」3.23代码学习

来源:互联网 发布:普通话软件哪个好 编辑:程序博客网 时间:2024/05/02 05:02

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

#encoding:utf8import 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_treel1=[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 平均成绩
2023

#encoding:utf8#求平均成绩##思路:##正式答案import numpy as npl1=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 l2print course_avgcomp=l2>=course_avg#print compprint 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 l3l4=[]  #列相加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 查找最大元素
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=iprint 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首字母大写
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统计元音
2027

#encoding:utf8##统计元音##目前存在的问题:##1\题意要求最后一组计数出来不输出空格,以下代码输出还是有空格。3.23##2\按测试出来结果有一个字母o计数不对,第二组测试实例o应为0,以下代码输出为1  3.23n=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求最小公倍数
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 敌兵布阵
1166-1
1166-2

#encoding:utf8##敌兵布阵##问题1:未加入人数判断条件import mathcommand=[]t=len(command)      #t tiao ming lingT=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
1 0
原创粉丝点击