2022-01-20 每日打卡:难题精刷
写在前面
“这些事儿在熟练之后,也许就像喝口水一样平淡,但却能给初学者带来巨大的快乐,我一直觉得,能否始终保持如初学者般的热情、专注,决定了在做某件事时能走多远,能做多好。” 该系列文章由python编写,所刷题目共三个来源:之前没做出来的 ;Leetcode中等,困难难度题目; 周赛题目;某个专题的经典题目,所有代码已AC。每日1-3道,随缘剖析,希望风雨无阻,作为勉励自己坚持刷题的记录。
2951. 「NOIP2018」货币系统

- 自底向上,递归更新(存在很多重复和无用信息):
def up(sys, n):
global maxx
if n in sys:
return 0
else:
sys.append(n)
for _ in sys:
tmp = _+n
if tmp<=maxx:
up(sys,tmp)
return 1
anum = eval(input())
for _ in range(anum):
mnum = eval(input())
sys, ans = list(), 0
a = [int(w) for w in input().split(" ")]
a.sort()
maxx = a[-1]
for n in a:
ans += up(sys, n)
print(ans)
- 动态规划更新:
anum = eval(input())
for _ in range(anum):
mnum = eval(input())
sys, ans = list(), mnum
a = [int(w) for w in input().split(" ")]
a.sort()
maxx = a[-1]
can = [False for _ in range(maxx+1)]
can[0] = True
# 对每个新加入的项进行检查
for _ in a:
# 已经满足,则答案减少1
if can[_]:
ans -= 1
# 更新can数组
# 所有加上该数的can的位置都应该被置1
for up in range(_, maxx+1):
can[up] = can[up] | can[up-_]
print(ans)
P3951 [NOIP2017 提高组] 小凯的疑惑

数论问题最简单的就是打表找规律,最后得出这个题的结果为a*b-a-b。
对于正整数p, q满足gcd(p,q)=1, 我们有px+qy=n无非负整数解的最大正整数n为pq−p−q。
using namespace std;
int a,b,c;
int main(){IOS;
cin>>a>>b;
cout<<(a*b-a-b);
return 0;
}
本文分享了作者每日坚持算法练习的心得体会,并详细解析了两道典型算法题:「NOIP2018」货币系统与P3951[NOIP2017提高组]小凯的疑惑。通过自底向上的递归更新与动态规划两种方法对比讲解货币系统的实现,而后介绍了数论问题的简化处理技巧。

被折叠的 条评论
为什么被折叠?



