C++ 教学PPT:基础算法之贪心算法

公众号:编程驿站
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
练习题:

贪心的导游
题目描述
南京有一条著名的购物街。购物街嘛,就是一排整齐的商店啦~

导游小 Z 每次都会把游客团带到购物街里走一段,然后选择一个商店进去购物。

小 Z 接待的游客都是购物狂,他们恨不得将店内的商品洗劫一空,也就是说,只要他们能买,就一定会继续买(钱够不够你不用考虑,他们都有信用卡可以透支)。

但是有一点,他们都非常讲究平等、很谦虚,每个人都不能忍受比别人多买什么东西或者少买什么东西,于是他们每个人最后买的商品数量都是一样的。这虽然导致他们没办法每次都把商店搬空,但是每次已经给店家带来一大笔生意了,店家已经非常感谢了!为了表示感谢,店家决定把游客们买完之后剩下来那几件没卖掉的商品就送给导游小 Z 了。

贪心的小 Z 自然希望自己能获赠的商品数量越大越好啦~

现在告诉你这一排共 n 个商店(标号为 0 到 n-1)每个商店里的商品总数,每次小 Z 会带一批共 p 个游客的旅游团,到其中 u 号商店和 v 号商店之间逛一逛,请你帮小 Z 在所逛的商店区间内选择一个,告诉小 Z 他最多能获赠多少件商品。

输入格式
第一行,包含两个整数 n,m,分别表示商店个数和小 Z 带来的旅游团个数。

接下来一行,包含 n 个整数 a_i,表示第 i 个商店的商品总数。

接下来 m 行,每行三个整数 u,v,p,表示这个旅游团逛 u 号商店和 v 号商店之间的商店(包含 u 和 v),且这个旅游团的人数为 p。

输出格式
共输出 m 行,每行一个整数,第 i 行输出第 i 个旅游团购物后,小 Z 最多能获赠的商品数量。

样例 #1
样例输入 #1
5 5
2 4 6 8 10
0 1 2
1 4 3
2 4 2
1 1 9
0 4 7
样例输出 #1
0
2
0
4
6
提示
样例解释
第一个旅游团, 2 个人, 0 号商店到 1 号商店的区间。若去 1 号商店,共 2 件商品,每人买 1 件,剩 0 件。若去 2 号商店,共 4 件商品,每人买 2 件,剩 0 件。所以,小 Z 最多获赠 0 件。

第二个旅游团, 3 个人,小 Z 选择带他们去 4 号商店,共 8 件商品,每人买 2 件商品(因为每人 3 件不够),剩下 2 件,小 Z 最多获赠就是 2 件。可以验证去其它商店小 Z 最多获赠的商品不会达到 2 件。

随机算法
题目描述
我们知道,求任意图的最大独立集是一类NP完全问题,目前还没有准确的多项式算法,但是有许多多项式复杂度的近似算法。

例如,小 C 常用的一种算法是:

对于一个 n 个点的无向图,先等概率随机一个 1…… n 的排列 p[1…… n]。

维护答案集合 S ,一开始 S 为空集,之后按照 i=1…… n 的顺序,检查 {p[i]}U S 是否是一个独立集,如果是的话就令 S={p[i]}U S。

最后得到一个独立集 S 作为答案。

小 C 现在想知道,对于给定的一张图,这个算法的正确率,输出答案对 998244353 取模。

输入格式
第一行两个非负整数 n,m 表示给定的图的点数和边数。

接下来 m 行,每行有两个正整数 (u,v) (u!=v) 描述这张图的一条无向边。

输出格式
输出正确率,答案对 998244353 取模。

样例 #1
样例输入 #1
3 2
1 2
2 3
样例输出 #1
665496236
提示
样例解释
这张图的最大独立集显然为 2,可以发现只有 p[1]=2 时会得出 S={2},否则都是 S={1,3},所以答案是 2/3。

快速阶乘算法
题目背景
有一天,NaCly_Fish 无意间看到一种高效求阶乘模大质数的算法,但是她太菜,并不会写。于是她就暴力造了数据,请您帮忙写出 std 吧。

什么,您问为什么不保证模数可以 NTT?
那样的话就可能被打表水过,或者答案就爆 int 了。

反正您是神仙,肯定能秒掉这题。

题目描述
给你正整数 n,和一个质数 p,你需要求出:
n! mod p有 T 组数据。

输入格式
第一行一个正整数 T,表示数据组数。
接下来 T 行,每行两个正整数 n,p,意义如题目描述。

输出格式
输出 T 行,表示每组数据的答案。

样例 #1
样例输入 #1
4
16777216 998244353
72267859 998244353
2333333 19260817
1919810 2147481811
样例输出 #1
789885751
569626621
16351109
1416439247
珠心算测验
题目描述
珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及。

某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法。他随机生成一个正整数集合,集合中的数各不相同,然后要求学生回答:其中有多少个数,恰好等于集合中另外两个(不同的)数之和?

最近老师出了一些测验题,请你帮忙求出答案。

输入格式
共两行,第一行包含一个整数 n,表示测试题中给出的正整数个数。

第二行有 n 个正整数,每两个正整数之间用一个空格隔开,表示测试题中给出的正整数。

输出格式
一个整数,表示测验题答案。

样例 #1
样例输入 #1
4
1 2 3 4
样例输出 #1
2
提示
【样例说明】

由 1+2=3,1+3=4,故满足测试要求的答案为 2。

注意,加数和被加数必须是集合中的两个不同的数。

学习算法

题目背景
暑假中,MLE 决定学习一下 OI 算法。

题目描述
暑假一共有 n 天,我们假设 MLE 每天都有足够的时间学 OI。MLE 列出了可供选择的 m 个算法。MLE 每天只能且必须学习一个算法。

而且,MLE 长时间学同一种算法会厌倦,所以每一种算法不能连续学习太多天,第 i 种算法最多可以连续学习 a_i 天。MLE 没有必要学习全部的算法。

MLE 想知道,自己有多少种不同的学习安排来度过这 n 天。两种学习安排不同仅当这两种安排中有至少一天学习的算法不同。因为方法可能过多,你只需要输出方案数对 10^9+7 取模即可。

输入格式
第一行为两个整数 n,m。
第二行 m 个整数 a_1,a_2,\cdots,a_m。

输出格式
输出一行一个整数,方案数对 10^9+7 取模的结果。

样例 #1
样例输入 #1
3 2
1 2
样例输出 #1
4
样例 #2
样例输入 #2
2 1
1
样例输出 #2
0
样例 #3
样例输入 #3
8 5
4 2 3 4 2
样例输出 #3
356314
提示
样例解释
样例 #1
第一种算法最多连续学习一天,第二种最多连续学习两天。故共有如下四种学习方式:

1,2,2。
2,1,2。
2,2,1。
1,2,1。
修改记录

还未开始修改

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一枚大果壳

码文不易,晚上熬夜需要点咖啡钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值