python笔记之2-读入+结构体数组+sort关键字排序+题目:国王的游戏(洛谷P1080)

emmm,之前的已经学了一点点PY了,但今天又碰到一题大整数的卡了好一会儿,于是做个笔记记录一下今天学的

首先是读入,之前的只能读一行一个数,显然太过狭隘了,现在我要一行读好几个数怎么办呢,只要用分隔符分割一下就好了:

wang=input().split(' ')
a=wang[0];b=wang[1];

这里我读入了两个数,并以空格分开。

接下来就是结构体了,但在python里面使用class来实现的:

class node:
    def _init_(self):
        self.left=0
        self.right=0

有了C语言基础的话简单看看就明白了。之前就知道def是个函数声明,那么对于这个_int_(self)构造函数应该不会太陌生。

里面定义了两个变量,left和right

这个结构体数组的话。。。直接放进去就好了:

hand=[]
for i in range(0,n):
    sold=input().split(' ')
    x=node()
    x.left=sold[0];x.right=sold[1];
    hand.append(x);

这个python的数组很强大,什么都能放进去。。。。

接下来就是关于数组的排序了,一般直接a.sort()就行了,如果要从大到小的话取一个反就好了:a.sort(reverse=True)

对于结构体排序的话,写一个cmp函数就好了,现在博主还不会像c++那样的重载QAQ只能手写cmp函数了,我们将sort里面的排序的关键字改成我们的cmp函数就好了:

def cmp(a):
    return a.right

hand.sort(key=cmp)

于是,这样一个对结构体排序的东西就完成啦,如果要取从大到小的话:hand.sort(key=cmp,reverse=True)像这样改改就好了

下面放一道洛谷的例题吧:

P1080 国王游戏

时间限制1.00s

内存限制125.00MB

题目描述

恰逢 HH国国庆,国王邀请nn 位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这 nn 位大臣排成一排,国王站在队伍的最前面。排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。

国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。

输入格式

第一行包含一个整数nn,表示大臣的人数。

第二行包含两个整数 aa和 bb,之间用一个空格隔开,分别表示国王左手和右手上的整数。

接下来 nn行,每行包含两个整数aa 和 bb,之间用一个空格隔开,分别表示每个大臣左手和右手上的整数。

输出格式

一个整数,表示重新排列后的队伍中获奖赏最多的大臣所获得的金币数。

输入输出样例

输入 #1复制

3 
1 1 
2 3 
7 4 
4 6 

输出 #1复制

2

说明/提示

【输入输出样例说明】

按11、22、33 这样排列队伍,获得奖赏最多的大臣所获得金币数为 22;

按 11、33、22 这样排列队伍,获得奖赏最多的大臣所获得金币数为22;

按 22、11、33 这样排列队伍,获得奖赏最多的大臣所获得金币数为 22;

按22、33、11这样排列队伍,获得奖赏最多的大臣所获得金币数为99;

按 33、11、22这样排列队伍,获得奖赏最多的大臣所获得金币数为 22;

按33、22、11 这样排列队伍,获得奖赏最多的大臣所获得金币数为 99。

因此,奖赏最多的大臣最少获得 22个金币,答案输出 22。

【数据范围】

对于 20%的数据,有 1≤ n≤ 10,0 < a,b < 81≤n≤10,0<a,b<8;

对于 40%的数据,有1≤ n≤20,0 < a,b < 81≤n≤20,0<a,b<8;

对于 60%的数据,有 1≤ n≤1001≤n≤100;

对于 60%的数据,保证答案不超过 10^9109;

对于 100%的数据,有 1 ≤ n ≤1,000,0 < a,b < 100001≤n≤1,000,0<a,b<10000。


这是一道贪心题,难度并不在于如何贪心,而是在大整数这里。。。。

我们只需要对右手从小到大排序,对于相等的左手从小到大排序,于是一边取数一边更新就好了,但博主好像不会两个关键字的py排序。。。所以想了个办法就是将他们的走右手之乘积排序。。。。

以下是AC代码:

class node:
    def _init_(self):
        self.left=0
        self.right=0

n=int(input())
wang=input().split(' ')
a=wang[0];b=wang[1];

hand=[]
for i in range(0,n):
    sold=input().split(' ')
    x=node()
    x.left=int(sold[0])
    x.right=int(sold[1])
    hand.append(x);

def cmp(a):
    return a.right*a.left

hand.sort(key=cmp)

ma=0
ss=1

for i in range(0,n):
    if i==0:
        ss*=int(a)
    else :
        ss*=int(hand[i-1].left)
    now=ss//int(hand[i].right)
    ma=max(ma,now)

print(ma);

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值