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;
}