【报告】NOIP2021普及组解题报告材料.docx

【报告】NOIP2021普及组解题报告材料.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
NOIP2021 普与组复赛解题报告 本人是潍坊一中的 wyw ,69 级,今年高一, 现在立刻就要 NOIP 了, 准备把历年的 NOIP 普与、提高组题目都做一下, 然后写写解题报告∵这个报告主要是给中学同学看的,所以我会写的具体一点 Prolem 1 珠心算测试 (count) |精. |品. |可. |编. |辑. |学. |习. |资. |料. * | * | * | * | |欢. |迎. |下. |载.  这道题其实很简洁, 意思就是说给你一些数 a1,a2,a3,a4...an, 然后让你回答有多少个 A+B=C 〔A ≠ B ≠〕满C足 (回答 C 的数量,而不是等式的数量 ) 方法一 那么有一种很明显的做法就是三层循环枚举 C、A 、B, 留意: C 是在最外层,假设找到了一个 A 和一个 B,满意上述等式,如此 C 是一个符合要求的解,这时 ans++ ,并且退出当前枚举,枚举下一个 C,这种 算法 的时间复杂度是 O(N3) 而我当时没想到这个算法,由于有更好用而且简洁更不简洁出错的解法, 方法二 两重循环,分别枚举 i=1...n,j=i+1...n ,假如 ai+aj 这个数在集合中存在,那么 you[ai+aj] ←true,然后再从 a1 到 an 做一次扫描,只要 you[ai], ans++ 这个算法的好处在于它很好写, 不用退出什么的, 也不用留意循环的次序, 而且时间复杂度是 O(N 2) 代码 (方法 2) : #includecstdio using namespace std; int n, a[101], i, j, count; bool you[20001]={false}; int main() { freopen(count.in,r,stdin); freopen(count.out,w,stdout); scanf(%d,n); for(i=1;i=n;i++)scanf(%d,a[i]); |精. |品. |可. |编. |辑. |学. |习. |资. |料. * | * | * | * | |欢. |迎. |下. |载. for(i=1;in;i++) for(j=i+1;j=n;j++) you[ a[i]+a[j] ]=true; count=0; for(i=1;i=n;i++) count += you[ a[i] ]; printf(%d\n,count); return 0; } 在此征求一下大神的看法,如有更快的做法,敬请奉上 小结: 这道题很简洁, 但许多人没有做对的缘由就是没有好好懂得题意, 但是根本缘由其实仍在于心态太自豪了, 认为是第一题就可以轻视,这样是不好的,水题我们更要做好啊, 你想想同 样是 100 分,这 100 分多么好拿,所以是水题、越该放平心态,细心地做;当时我正是由 于重视〔 2021 年第一题爆零的教训〕,用了整整 15 分钟才做好,最终得了 100 分 Problem 2 比例简化 这道题目是说,给定 A 和 B,求解一组 A’ 和 B’ ,满意以下条件: A ′B ′- AB ≥00A ′,B′≤L A ′和 B′互质 第一,想一个总体的框架: 我们发觉 L ≤100,因此可以枚举 A ′和 B′,然后判定是否 A’B’ 满意上述条件,并且打擂台求比值最小的一组就行了,打擂台的复杂度是 O(1);设验证的复杂度为 O(k),如此总的算法的复杂度为 O(kL 2) ,其中 L 2 是 104,所以我们只要保证 k 的大小在 100 以内就肯定没有问题; 现在要求两个分数的差值,该怎么办呢?高精除!很 |精. |品. |可. |编. |辑. |学. |习. |资. |料. * | * | * | * | |欢. |迎. |下. |载. 多人一下就想到了,当时我在赛场上就是这么想的,但是又认真一考虑;;;;;第一,高 精除有风险,而且假如我是出题者的话, 我肯定会卡高精除, 其次,高精除的编程复杂度很高,很简洁出错而且耗时间 于是我重新读题,找寻一些特殊的切入点,最终看到了这个东 西: 1≤A,B ≤106,我的脑袋里瞬时就萌生出一种想法:模拟手动比拟分数 —— 就是说假如你要比拟两个分数,就先把他们通分,然后比拟分子的大小,如 ab 和 cd 比拟,先把它们化 成 adbd 和 bcbd 的形式,然后比拟 ad 和 bc 的大小,而在整个枚举的过程中,你最大的情形 只需要比拟 A ′B ′和 AB 的大小 ,而且他们分母的乘积最大是 108,到此,问题就完善地解决了! 贴上代码: #includecstdio #includeiostream using namespace std; long A,B,a

文档评论(0)

小橙学习资料 + 关注
实名认证
内容提供者

学习资料 欢迎下载

1亿VIP精品文档

相关文档