解题思路:模拟题目描述的过程,暴力法
注意事项:在遍历时要注意,因为每当索引与数字相同时都要,拿掉这张卡片,如果用数组存储卡片索引的话,要找到这张卡片并保证数组索引不越界较为困难和繁琐,换个思路--题目提到了顺时针顺序,而且每次只向后移动一格,是不是可以把卡片序列看成单链表呢?,每次拿掉一张卡片只需要修改前面节点的next指针指向当前节点的next指针,这个卡片(节点)在遍历时就不会被遍历到,当前卡片从逻辑上被删除了,这样就省去考虑如何指向下一张卡片的问题,因为地址都存在next指针里
参考代码:
import copy class Node:#单链表结点类 def __init__(self, val): self.val = val self.next = None n = int(input().strip()) headv = Node(None)#生成虚拟头结点,便于后续对结点的操作(省去判断是否是头结点,因为头结点没有前驱结点,现在用虚拟结点来代替) cur = headv nums = [] for each in map(int, input().strip().split()):#读取输入.并生成单链表 cur.next = Node(each) cur = cur.next nums.append(each) cur.next = headv.next#让尾结点next指针指向头结点,因为单链表要遍历不止一次 max_gain = float("-inf") for j in range(n): prev = copy.deepcopy(headv)#每次都要修改链表,所以拷贝副本,对副本操作 cur = prev.next gain = 0 i = 0 temp = nums.copy() # 用于记录最大值 while j: # 不同的开始位置 prev = cur cur = cur.next j -= 1 while temp and i < max(temp): # 如果i>数组中的最大值就结束,即不可能再得到卡片 if cur.val == i + 1: temp.remove(i+1) gain += i+1 i = 0 prev.next = cur.next # 删除当前结点 cur.next = None cur = prev.next else: i += 1 prev = cur cur = cur.next max_gain = max(gain, max_gain) print(max_gain)
0.0分
0 人评分
剪刀石头布 (C语言代码)浏览:1433 |
C语言程序设计教程(第三版)课后习题12.3 (C语言代码)浏览:542 |
排序算法(选择,插入,冒泡)浏览:775 |
小O的乘积 (C语言代码)浏览:1009 |
C语言训练-字符串正反连接 (C语言代码)浏览:630 |
C语言程序设计教程(第三版)课后习题4.9 (C语言代码)浏览:558 |
2004年秋浙江省计算机等级考试二级C 编程题(1) (C语言代码)浏览:581 |
2004年秋浙江省计算机等级考试二级C 编程题(2) (C语言描述——递归算法)浏览:1122 |
明明的随机数 (C语言代码)浏览:613 |
【亲和数】 (C++代码)浏览:532 |