PAT (Advanced Level) Practice 【python】

1002 A+B for Polynomials

这道题坑好多 要不是忘记输出小数点后一位的格式要不就是最后的空格 还是要注意细节

在这里插入图片描述
坑点 第六个测试点 要注意格式 如果最后输出为0 也不能有空格
还是自己考虑问题不够全面

x=list(map(eval,input().split()))
y=list(map(eval,input().split()))
m=x[0]
n=y[0]
k=max(x[1],y[1])
res=[0 for i in range(k+1)]
for i in range(2,len(x),2):
    res[x[i-1]]=x[i]
for i in range(2,len(y),2):
    res[y[i-1]]+=y[i]
count=0
flag=len(res)
for i in range(len(res)-1,-1,-1):
    if res[i]==0:
        flag-=1
r=[]
cc=0
for i in range(len(res)-1,-1,-1):
    if res[i]==0:
        continue
    else:
        cc+=1
        r.append(i)
        r.append("%.1f"%(res[i]))
if len(r)==0:
    print(cc)
else:
    print(cc,end=" ")
    print(*r)

1003 Emergency

这道题主要还是dijkstra求最短路径 只是算人数的时候取相同长度路径里人数最大的

n, m, a, b = map(int, input().split())
team = list(map(int, input().split()))
dis = [[float("inf") for i in range(n)] for j in range(n)]
for i in range(n):
    dis[i][i] = 0
for i in range(m):
    c, d, e = map(int, input().split())
    dis[c][d] = e
    dis[d][c] = e
map = [-1 for i in range(n)]
di = [float("inf") for i in range(n)]  # distance
di[a] = 0
people = [0 for i in range(n)]  # 救援人数
people[a] = team[a]
num = [0 for i in range(n)]  # 路径数量
num[a] = 1
for i in range(n):
    v = -1
    for j in range(n):
        if ((v == -1 or di[j] < di[v]) and map[j] != 1):
            v = j
    map[v] = 1
    for j in range(n):
        if j == v:
            continue
        if (di[j] == di[v] + dis[v][j]):
            num[j] += num[v]
            people[j] = max(people[j], people[v] + team[j])
        if (di[j] > di[v] + dis[v][j]):
            di[j] = di[v] + dis[v][j]
            num[j] = num[v]
            people[j] = people[v] + team[j]
print("%d %d" % (num[b], people[b]))
1004 Counting Leaves
#include<iostream>
using namespace std;
 
struct ChildLink{
	int ID;
	ChildLink *next;
	ChildLink(){next=NULL;}
};
 
struct Node{
	int K;
	ChildLink *Child;
	Node(){
		K=0;
		Child=NULL;
	}
};
Node *node;
 
int t,count[100];
void CountLeaves(int num,ChildLink *C)		//网查的递归嵌套方法,求每层叶子节点数目	
{	
	num++;
	while(C){
		if(node[C->ID].K==0) count[num]++;
		else{
			CountLeaves(num,node[C->ID].Child);
		}
		C=C->next;
	}
	if(t<num) t=num;
}
 
int main()
{
	int i,j,N,M,id;
	ChildLink *c;
	cin>>N>>M;
	node=new Node[N+1];
	for(i=0;i<M;i++){
		cin>>id;
		cin>>node[id].K;
		for(j=0;j<node[id].K;j++){
			c=new ChildLink;
			cin>>c->ID;
			if(node[id].Child) c->next=node[id].Child;	//链表存储
			node[id].Child=c;
		}
	}
	if(node[1].K==0){
		count[0]=1;
	}
	else{
		CountLeaves(0,node[1].Child);
	}
	for(i=0;i<t;i++){
		cout<<count[i]<<" ";
	}
	cout<<count[t]<<endl;
	return 0;
}
1005 Spell It Right
di={1:"one",2:"two",3:"three",4:"four",5:"five",6:"six",7:"seven",8:"eight",9:"nine",0:"zero"}
x=input()
su=0
for i in x:
    su+=int(i)
res=[]
for i in str(su):
    res.append(di[int(i)])
print(*res)

1006 Sign In and Sign Out
n=int(input())
a,b,c=map(str,input().split())
x,y,z=b.split(":")
mi=z+y*60+x*3600
x,y,z=c.split(":")
ma=z+y*60+x*3600
res=[a,a]
for i in range(n-1):
    a,b,c=map(str,input().split())
    x,y,z=b.split(":")
    tmi=z+y*60+x*3600
    if(tmi<mi):
        mi=tmi
        res[0]=a
    x,y,z=c.split(":")
    tma=z+y*60+x*3600
    if(tma>ma):
        ma=tma
        res[1]=a
print(*res)
   
1008 Elevator
# elevator up 6 down 4 stay 5
# print(6+6+5+6+5+4+4+5)
lis=list(map(int,input().split()))
n=lis[0]
k=0
s=0
for i in range(n):
    l=k-lis[i+1]
    if l>0:
        s+=l*4
        k=lis[i+1]
    else:
        s += l * (-6)
        k = lis[i + 1]
    s+=5
print(s)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值