算法与数据结构例题记录

发布于:2022-10-28 ⋅ 阅读:(368) ⋅ 点赞:(0)

目录

7-3 集合相似度

输入格式

输出格式

输入样例

输出样例

代码展示

知识点

7-5 构造散列表

输入格式

输出格式

输入样例

输出样例

代码展示

散列表7.10 集合运算

★实验任务

★数据输入

输入示例

输入示例

代码展示

散列表7.12 三角形游戏

★实验任务

★数据输入

★数据输出

输入示例

输出示例

代码展示


7-3 集合相似度

给定两个整数集合,它们的相似度定义为:Nc​/Nt​×100%。其中Nc​是两个集合都有的不相等整数的个数,Nt​是两个集合一共有的不相等整数的个数。你的任务就是计算任意一对给定集合的相似度。

输入格式

输入第一行给出一个正整数N(≤50),是集合的个数。随后N行,每行对应一个集合。每个集合首先给出一个正整数M(≤104),是集合中元素的个数;然后跟M个[0,109]区间内的整数。

之后一行给出一个正整数K(≤2000),随后K行,每行对应一对需要计算相似度的集合的编号(集合从1到N编号)。数字间以空格分隔。

输出格式

对每一对需要计算的集合,在一行中输出它们的相似度,为保留小数点后2位的百分比数字。

输入样例

3
3 99 87 101
4 87 101 5 87
7 99 101 18 5 135 18 99
2
1 2
1 3

输出样例

50.00%
33.33%

代码展示

def getele()->list:
        a = input().split(' ')
        a = [int(a[i]) for i in range(len(a))]
        return a
my_list=[]
num1=int (input())
while num1>0:
    num1-=1
    cont = getele()
    my_set=set()
    for i in cont[1:]:
        my_set.add(i)
    my_list.append(my_set)
num2=int (input())
while num2:
    num2-=1
    cont=getele()
    len1=len(my_list[cont[0]-1])
    len2=len(my_list[cont[1]-1])
    if len1>=len2:
        newset=my_list[cont[0]-1].difference(my_list[cont[1]-1])
        ans=float ((len1-len(newset))/len(my_list[cont[0]-1].union(my_list[cont[1]-1])))
    else:
        newset = my_list[cont[1] - 1].difference(my_list[cont[0] - 1])
        ans = float((len2-len(newset))/ len(my_list[cont[1] - 1].union(my_list[cont[0] - 1])))
    ans=ans*100
    print('%.2f' %ans,end='')
    print('%')

知识点

  • 保留小数的几种方法:
    1、
    print('%.2f' %ans,end='')
    print('%')
    2、round默认去掉多余的零,末尾只保留一个0
    print(round(ans,2),end='')
    print('%')
  • 集合操作:

difference()差集,union()并集,都是生成新的集合返回

7-5 构造散列表

设散列表a[18],散列函数是hask(k)=k%17,用开放地址法解决冲突hi=(h0+di)%m。冲突时,使用增量序列di=5i。计算输入序列(值>=0)对应的散列地址值。(输入个数不会超过15个)

输入格式

第一行为输入个数;

第二行为对应的输入值,用空格隔开。

输出格式

按输入顺序输出其散列地址。每行对应一个值及其散列地址,中间用空格隔开(即pos前后均有一个空格)

输入样例

5
141 73 95 112 56

输出样例

141 pos: 5
73 pos: 10
95 pos: 15
112 pos: 2
56 pos: 7

代码展示

def hask(i:int):
    return i%17
def add(i:int):
    con=i
    i=hask(i)
    while my_list[i]!=0:
        i+=5
        if i>18:
            i=i-18
    my_list[i]=con
def getele()->list:
        a = input().split(' ')
        a = [int(a[i]) for i in range(len(a))]
        return a
num1=int (input())
cont=getele()
my_list=[]
new_list=[]
for i in range(18):
    my_list.append(int (0))
for c in cont:
    new_list.append(c)
    add(c)
for i in range(num1):
    print(new_list[i],end=' ')
    print(f"pos:",end=' ')
    print(my_list.index(new_list[i]))

散列表7.10 集合运算

★实验任务

有一天,你正在学习算法与数据结构。突然看到一个很有趣的知识点,集合运算!聪明的你很快的就掌握了并集运算、交集运算和差集运算。这里就出小小的问题帮你检验一下掌握情况吧。 给你三组数。当你用集合的定义将他们转化成三个集合A、B、C后,如果A集合与B集合能通过上述三种集合运算(并集运算、交集运算和差集运算)得到集合C。则从小到大输出集合C的所有元素,否则输出“What a pity!”(不含引号)。

★数据输入

第一行输入包括n、m、k三个整数。 第二行输入n个整数,即A数组。 第三行输入m个整数,即B数组。 第四行输入k个整数,即C数组。

★数据输出 如果A集合与B集合最后运算结果与C集合相同,即输出这个结果(按升序),否则输出“What a pity!” (不含引号)。

输入示例

5 5 4
1 2 3 4 5
2 3 4 5 6
2 3 4 5

输入示例

2 3 4 5

代码展示

def getele()->list:
        a = input().split(' ')
        a = [int(a[i]) for i in range(len(a))]
        return a
input()
k=0
my_list1=getele()
my_list2=getele()
my_list3=getele()
A=set()
B=set()
C=set()
for i in my_list1:
    A.add(i)
for i in my_list2:
    B.add(i)
for i in my_list3:
    C.add(i)
new1=A.union(B)
new2=A.difference(B)
new3=A.difference(new2)
my_list3.sort()
if new1==C:
    for i in my_list3:
        if k < 0:
            print(' ', end="")
        k -= 1
        print(i, end='')
elif new2==C:
    for i in my_list3:
        if k < 0:
            print(' ', end="")
        k -= 1
        print(i, end='')
elif new3==C:
    for i in my_list3:
        if k < 0:
            print(' ', end="")
        k -= 1
        print(i, end='')
else:
    print("What a pity!")

散列表7.12 三角形游戏

★实验任务

给定n个三角形,用a,b,c表示三角形的三条边(三角形可能有重复)。之后有m次询问,每次询问一个三角形在给定的n个三角形中出现的次数。

★数据输入

第一行为n,之后n行,每行有a,b,c三个数字表示三角形的三条边;接下来一行为m,之后有m行询问,每行有a,b,c三个数字,表示要询问的三角形的三边。 数据保证a,b,c为正整数且可以构成一个三角形,且a,b,c不一定有序 对于40%的数据,n<=100,m<=100,a,b,c<=100 对于70%的数据,n<=1000,m<=1000,a,b,c<=1000 对于100%的数据,n<=5,000,m<=100,000,a,b,c<=999999

★数据输出

对于每次询问,输出此三角形在之前给定的n个三角形中出现的次数

输入示例

3
2 2 3
3 3 4
2 3 2
3
2 3 2
3 3 4
1 1 1

输出示例

2
1
0

代码展示

def getele()->list:
        a = input().split(' ')
        a = [int(a[i]) for i in range(len(a))]
        return a

num1=int (input())
my_list1=[]
my_list2=[]
while num1:
    num1-=1
    cont=getele()
    s=[]
    for i in cont:
        s.append(i)
    s.sort()
    my_list1.append(s)
num2=int (input())
while num2:
    num2-=1
    cont=getele()
    s = []
    for i in cont:
        s.append(i)
    s.sort()
    my_list2.append(s)
for i in my_list2:
    count=0
    for j in my_list1:
        if i==j:
            count+=1
    print(count)