- 黑桃花
-
奥塞初选题
学这个吧。
第五章 其它数学知识及算法
5.1 鸽巢原理
5.2 容斥原理
5.3 常见递推关系及应用
5.1 鸽巢原理
1.简单形式
如果n+1个物体被放进n个盒子,那么至少有一个盒子包含两个或更多的物体。
例1:在13个人中存在两个人,他们的生日在同一月份里。
例2:设有n对已婚夫妇。为保证有一对夫妇被选出,至少要从这2n个人中选出多少人?(n+1)
2.加强形式
令q1,q2,...qn为正整数。如果将
q1+q2+...+qn-n+1个物体放入n个盒子内,那么或者第一个盒子至少含有q1个物体,或者第二个盒子
至少含有q2个物体,...,或者第n个盒子含有qn个物体.
例3:一篮子水果装有苹果、香蕉、和橘子。为了保证篮子内或者至少8个苹果或者至少6个香蕉或者至少9
个橘子,则放入篮子中的水果的最小件数是多少?(21件)
5. 2 容斥原理及应用
原理:集S的不具有性质P1,P2,...,Pm的物体的个数由下式给出:
|A1∩A2∩...∩Am|=|S|-∑|Ai|+∑|Ai∩Aj|-∑|Ai∩Aj∩Ak|+...+(-1)m|A1∩A2∩...∩Am|
如:m=3,时上式为:
|A1∩A2∩A3|=|S|-(|A1|+|A2|+|A3|)+(|A1∩A2|+|A1∩A3|+|A2∩A3|)-|A1∩A2∩A3|
推论:至少具有性质P1,P2,...Pm之一的集合S的物体的个数有:
| A1∪A2∪....∪Am|=|S|—|A1∩A2∩...∩Am|=
∑|Ai|-∑|Ai∩Aj|+∑|Ai∩Aj∩Ak|+...+(-1)m+1|A1∩A2∩...∩Am|
例4:求从1到1000不能被5,6,和8整除的整数的个数?
(1000-(200+166+125)+(33+25+41)-8=600)
5.3 常见递推关系及应用
1.算术序列
每一项比前一项大一个常数d;
若初始项为h0:则递推关系为 hn=hn-1+d=h0+nd;
对应的各项为:h0,h0+d,h0+2d,....,h0+nd;
前n项的和为(n+1)h0+dn(n+1)/2
例5: 1,2,3,...
例6: 1,3,5,7...等都是算术序列。
2.几何序列
每一项是前面一项的常数q倍
若初始项为h0:则递推关系为 hn=h0qn-1q=h0qn;
对应的各项为: h0,h0q1,h0q2,....,h0qn
例7: 1,2,4,8,16,...
例8: 5,15,45,135,...等都是几何序列;
前n项和为((qn+1-1)/(q-1) )h0
3.Fibonacci序列
除第一、第二项外每一项是它前两项的和;
若首项为f0为0,则序列为0,1,1,2,3,5,8...递推关系为(n>=2)fn=fn-1+fn-2
前n项的和Sn=f0+f1+f2+...+fn=fn+2-1
例9:以下是Fibonacci的示例:
1.楼梯有n阶台阶,上楼可以一步上1阶,也可以一步上2阶,编一程序计算共有多少种不同的走法?
2.有一对雌雄兔,每两个月就繁殖雌雄各一对兔子.问n个月后共有多少对兔子?
3.有n*2的一个长方形方格,用一个1*2的骨牌铺满方格。求铺法总数?
4.错位排列
首先看例题:
例10:在书架上放有编号为1,2,....n的n本书。现将n本书全部取下然后再放回去,当放回去时要求每本书都不能
放在原来的位置上。
例如:n=3时:
原来位置为:123
放回去时只能为:312或231这两种
问题:求当n=5时满足以上条件的放法共有多少种?(不用列出每种放法) (44)
{1,2,3,....,n}错位排列是{1,2,3,..,n}的一个排列i1i2...in,使得i1<>1,i2<>2,i3<>3,...in<>n
错位排列数列为
0,1,2,9,44,265,....
错位排列的递推公式是:dn=(n-1)(dn-2+dn-1)(n>=3)
=ndn-1+(-1)n-2
5.分平面的最大区域数
1.直线分平面的最大区域数的序列为:
2,4,7,11,....,
递推公式是: fn=fn-1+n=n(n+1)/2+1
2.折线分平面的最大区域数的序列为:
2, 7, 16,29, ...,
递推公式是:fn=(n-1)(2n-1)+2n;
3.封闭曲线(如一般位置上的圆)分平面的最大区域数的序列为:
2, 4, 8, 14,...,
递推公式是:fn=fn-1+2(n-1)=n2-n+2
6.Catalan 数列
先看下面两个例题:
例11:将一个凸多边形区域分成三角形区域的方法数?
令hn表示具有n+1条边的凸多边形区域分成三角形的方法数。同时令h1=1,则hn满足递推关系
hn=h1hn-1+h2hn-2+...+hn-1h1(n>=2)(想一想,为什么?)
该递推关系的解为hn=c(2n-2,n-1)/n (n=1,2,3,...)
其对应的序列为1,1,2,5,14,42,132,....从第二项开始分别是三边形,四边形,...的分法数
即k边形分成三角形的方法数为hk=c(2k-4,k-2)/(k-1)(k>=3)
例12:n个+1和n个-1构成2n项 a1,a2,...,a2n
其部分和满足a1+a2+...+ak>=0(k=1,2,3,..,2n)对与n该数列为
Cn=c(2k,k)/(k+1) (k>=0) 对应的序列为 1,1,2,5,14,42,132,...
序列1,1,2,5,14,42,132,....叫Catalan数列。
例13:下列问题都是Catalan数列。
1.有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,
剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?
2.一位大城市的律师在她住所以北n个街区和以东n个街区处工作。每天她走2n个街区去上班。如果他
从不穿越(但可以碰到)从家到办公室的对角线,那么有多少条可能的道路?
3.在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数?
4.n个结点可够造多少个不同的二叉树?
5.一个栈(无穷大)的进栈序列为1,2,3,..n,有多少个不同的出栈序列?
- meira
-
是不是会考题啊,或者奥塞初选题!
题一书写有错误,细心点啊!
题一:
1:j<=k
2:k:=k-j
3:a[l]:=a[l]+1
4:j-1
题二可能有问题。你去www.vijos.cn问问。
祝OI路上顺利!!
相关推荐
vijos p1059 积木城堡 过不了怎么了? c++编程
第一点:cout<<su;,最后这里为什么会输出su呢?第二点:if(j+a[r][i]<=su) { f[r][j]=max(f[r][j],f[r][j+a[r][i]]+a[r][i]); if(f[r][j]>=0) ex[r][f[r][j]]=1; }这里完全不懂你想做什么,之前不是初始化f[i][j]=-99999999;了么,只有f[i][0]=0;,那么max中什么时候会取到f[r][j+a[r][i]]+a[r][i]值?只要a[r][i]>0,则j+a[r][i]>0,那么f[r][j+a[r][i]]肯定是-99999999,f[r][j+a[r][i]]+a[r][i]也肯定不会>=02023-07-09 17:31:031
vijos上怎么建立团队和加入团队
http://www.vijos.cn/Discuss_Show.asp?DisID=17645就这样了...加入的话,你自己到userspace里面修改自己的团队就可以了.. .....我都把这个贴置顶了..估计不是你一个人不知道2023-07-09 17:31:091
vijos问题 请问题库中的测试数据怎么弄到?
你可以弄个小号去试,输入错误的答案,他的答案就会显示出来。输入数据你可以readln(n);writeln(n);虽然比较龌龊,但是......2023-07-09 17:31:174
vijos怎么啦(2010年)
我是Vijos某管理员。去年年底先是缺乏资金,然后想办法搞了临时服务器又被攻击,接着又遇到了技术问题。正好现任管理员大都是高三的,都要参加保送生考试或者准备高考了,于是这段时间就没有运作。我们会想办法马上恢复运作的,谢谢关注。2023-07-09 17:31:231
在哪里可以下载Uva,Spoj,sgu的题库?编程的
Online Judge简称OJ,意思是在线评测平台,多指信息学在线评测平台。知名的OJ有:URAL,SPOJ,vijos,USACO,sgu,pku(poj),zju(toj),tju,uva等。著名OJ网址:北京大学pku: http://acm.pku.edu.cn/OnlineJudge/ (most English)美国官方USACO: http://ace.delos.com/usacogate/ (America, English)高效信息学评测系统vijos: http://www.vijos.cn (维护中)南开大学nkpc: http://acm.nankai.edu.cn (most English)首先是国内比较老牌的知名OJ:PKU/POJ(Peking University Judge Online For ACM/ICpc)地址: http://acm.pku.cn/JudgeOnline 介绍:北京大学的题库,我主要在做的一个.题目数量很多,OJ的各项功能也很完善,而且还提供免费的OJ系统下载,可以利用提供的系统自己搭建OJ.题目数量很多,有几千道,但水题也很多.关于这一点,因为题目数量大,所以水题自然就多,但这不说明PKU的题目质量不高.PKU的难题还是不少的,而且做不做水题还是要由做题人自己决定的,和OJ无关.推荐程度(最高10):8推荐做法:如果是初学者或者仅仅想提高变成准确性,那么按照AC率做,保证1Y率;如果是有一定水平的OIer,可以每页完成40~50题;如果是大牛,那么尽量做吧;如果想专门训练某个项目,可以去网上搜pku题目分类,个人觉得pku里的dp题和数学题比较多.ZJU/ZOJ(Zhejiang University Online Judge)地址: http://acm.zju.edu.cn/ 介绍:浙江大学的题库,国内起步最早的几个OJ之一.题目数量也接近2000.我没有太多的做zju的题目,所以不好说题目质量如何.OJ系统的友好性不如pku,但功能并不差.应该可以作为pku的替代品.推荐程度:7推荐做法:无(可以参考pku做法)然后是一些不太知名的或比较新的:Vijos(Velocious Informatics Judge Online System)地址: http://www.vijos.cn/ 介绍:说到现在的OJ,就不得不提Vijos.Vijos是Vivian Snow(就是湖南师大附中的刘康,个人主页是 http://www.viviansnow.cn/, 现在似乎上不去了=.=)搞的一个Judge系统,本来是作为创新大赛作品的,后来就搞起来了,现在人气很旺.但是Vijos的各种事情很多,而且服务器不稳定,速度慢不说还时不时的关闭.关于Vijos的事情大家可以参考Dragon.Dai在Vijos的1周岁时候写下的这篇 ( http://www.mybloop.com/get/376674/Vijos.doc ),这里不再赘述.Vijos上所有人都可以上传自己的题目,虽然增加了很多灵活性,但由此导致的是题目水平参差不齐.而且上传题目的人在选择题目难度的时候很难做出同样的判断,都有自己的个人见解,所以本来题目难度是很好的一个设计,现在却成了鸡肋.推荐程度:5推荐做法:用来测试竞赛原题,另外可以做一做AC率较低的题目.不推荐做大量的Vijos题目(yours牛别打我...).TJU/TOJ(Tianjin University Online Judge)地址: http://acm.tju.edu.cn/toj 介绍:可能大家都以为是同济的题库了吧=.=,其实这个是天津大学的,因为笔者是天津人,所以对这个OJ有独特的感情...虽然没怎么做过.总体来说比zoj稍差,题目质量不确定(我说了我没怎么做过...),一般我都用来做Contests.推荐程度:5推荐做法:无,可以做做Contests.注意是Online Contests而不是Virtual Contests,Virtual那个...打开就能知道,是利用TOJ自己的题库出Contests...其实这个设计很新颖,所有人都可以出测试.适合队内搞测验...NKOJ(Nankai Online Judge)地址: http://acm.nankai.edu.cn/ 介绍:这个是天津市南开大学的OJ,想必大多数人都不知道吧?在看下面的介绍之前,你可以先上去看看,体会一下.你一定会发现,通过大量Ajax技术的应用,加上清新的界面,你会感到十分舒适.而且nkoj似乎有一个功能是自己不出现在Rank List和Status里面,这个功能很贴心.题目是nkoj最大的弱点,数量不大,质量一般.不过因为是中英文题目夹杂且中文题目数量不少(和pku比),所以想做中文题的除了Vijos也可以来这里看看.其实nkoj比vijos要漂亮的多,速度比vijos稍快,稳定性...应该比vijos好不少吧.推荐程度:5推荐做法:做中文题.rqnoj(RenQingNet Online Judge,任青网络信息学奥赛(OI)在线判题系统)地址: http://www.rqnoj.cn/ 介绍:一个新兴的OJ,题目质量一般,数量也不多.除了去刷Rank,没有什么值得做的.推荐程度:2推荐做法:无.接下来说一下国外的OJ:SGU(Saratov State University Online Contester)地址: http://acm.sgu.ru/ 介绍:sgu是俄罗斯斯坦福州立大学(大概是这个名字)的OJ,很老牌了.题目数量很少,但题题精炼,每做一道题都会让你的编程水平上升.在有一定编程水平之后可以试着做做,要争取做出每一道题.如果sgu能全部AC的话...那这个人不是抄袭就是神牛...注意status需要通过左边的"status online"链接来看,而且sgu速度稍慢并且不太稳定.总之是非常特别以及及其应该推荐的OJ.推荐程度:9推荐做法:AC每一道题,可以按照AC Rate来做.Ural(Timus Online Judge)地址: http://acm.timus.ru/ 介绍:Ural是Ural State University的一个OJ,题目不是很多,但都是原创,而且比较经典.如果sgu做着费劲,那么试试Ural吧.推荐程度:8推荐做法:试着做做每一道题吧,可以按照AC Rate来.2023-07-09 17:31:301
pascal编程 信息学奥赛 vijos p1041 神风堂问题
program shfeng;const m=1e-6;varp,q:double;n:longint;beginreadln(p,q);p:=p/100;q:=q/100;n:=1;if p<>0 thenwhile trunc(n/q+m)+1>trunc(n/p-m) do inc(n);writeln(trunc(n/q+m)+1);end. 绝对正确,我在VIJOS上A了2023-07-09 17:31:375
c++ 编译提示错误号128
你这么问也不是一个办法,建议你装一下MSDN,MSDN有关于错误的文章可以参考,不过是全英文的。在MSDN的搜索页中查找关键字即可。2023-07-09 17:31:525
noip2008提高组 传纸条(方格取数) vijos -1493 pascal
i 枚举的是步数、 j、k分别是代表两条路径的横坐标。ord(j<>k)意思是:当j=k时,那么ord(j<>k)=0,也就是两条路径在该点重叠,那么这个价值只加一次;当j<>k时,ord(j<>k)=ord(true)=1 ,那么此时也就加两次了。2023-07-09 17:32:053
C++中,用itoa函数在tyvj和vijos上评测为什么编译错误?!
itoa不是标准函数,请使用sscanf转换数字到字符串。itoa 为c语言的一个函数。itoa 函数是一个广泛应用的,从非标准扩展到标准的C语言。它不能被移植,因为它不是标准定义下的C语言,但是,编译器通常在一个不遵循程式标准的模式下允许其通过header ,因为它是一个从逻辑对应到标准库的函数。itoa 取整数输入值,并将其转换为相应进制数字的字符串。2023-07-09 17:32:133
信息学奥林匹克竞赛
来得及,不过要看你是什么省的了,有些省很强,要进省队参加noi根本很难。如果你有点数学基础会好一点。英语对于noip不是很重要。当然好的话你可以上英语网站题库。教材,我看这个比较好《奥赛经典》,语言篇,基础篇,提高篇,一本本看过来。然后看一本好像是《信息学奥林匹克竞赛指南》,红色的书,看完上面那个语言篇就可以看这个了,这个看完拿省一等奖(NOIP)没什么问题。看完语言篇你可以上www.vijos.cn做点题目(它有分类,就做基础,难度为一),一边做一边看基础篇和后面那本书。然后慢慢提高难度。(这个题库上面有难度分类,也有算法分类,你可以学习一种算法,到该算法分类上练习一下)楼上的计划好比较完美啦,我随便说一下吧1个月学习语言(前面么什么输入输出拉,函数,条件,循环,也包括文件输入输出、字符串处理,数组,集合)接下来学习算法。1l都有说,枚举,回溯,贪心,分治,排序,递归,高精度,搜索,动态规划(这个很重要),之后么可以学习数据结构树,然后是图论算法。搜索和动态规划特别重要!动态规划是noip必须考的!www.vijos.cn上面还有真题,你可以看看另外,参加noi的话还要更加高深的算法。等你拿了noip一等后买一本《算法艺术与信息学竞赛》,上面的东西都要考。祝你成功~2023-07-09 17:32:223
Pascal编程的动规是什么意思??
动规和递归的关系十分密切。通俗地讲,向一个函数传递相同参数,结果都一样的递归函数可以用动规来实现。也就是说动规是递归的一个子集,如果你理解了递归,动规也就是水到渠成的事了。在形式上,你会发现原来整一个状态转移方程就是一个递归函数实体。在行为上,动规记录了递归过程中计算的结果,所以避免了重复运算,因而更高效。比较典型的问题是01背包和最长上升子序列。不过现在有些动规的入门文章讲得有些杂,讲基础动规的时候,竟然把动归的优化也加了进来,却没有给读者提示,这就需要读者细心揣摩。如果你对动规有了一定的认识后,以下是动规的一些小题目,可以做一下:http://www.vijos.cn/Problem2.asp?Type=2当然以上只是通俗得讲,要完全理解动规的数学定义可以去看一下《统筹学》。2023-07-09 17:32:481
什么是虫蚀算?
这是OI竞赛原题 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母。来看一个简单的例子: 43#9865#045 + 8468#6633 = 44445506678 其中#号代表被虫子啃掉的数字。根据算式,我们很容易判断:第一行的两个数字分别是5和3,第二行的数字是5。 现在,我们对问题做两个限制: 首先,我们只考虑加法的虫食算。这里的加法是N进制加法,算式中三个数都有N位,允许有前导的0。 其次,虫子把所有的数都啃光了,我们只知道哪些数字是相同的,我们将相同的数字用相同的字母表示,不同的数字用不同的字母表示。如果这个算式是N进制的,我们就取英文字母表午的前N个大写字母来表示这个算式中的0到N-1这N个不同的数字:但是这N个字母并不一定顺序地代表0到N-1)。输入数据保证N个字母分别至少出现一次。 BADC + CRDA = DCCC 上面的算式是一个4进制的算式。很显然,我们只要让ABCD分别代表0123,便可以让这个式子成立了。你的任务是,对于给定的N进制加法算式,求出N个不同的字母分别代表的数字,使得该加法算式成立。输入数据保证有且仅有一组解http://www.vijos.cn/Problem_Show.asp?id=10992023-07-09 17:32:552
那个noip在线题库叫什么TYIJ?
全名是:Tyvj _信息学在线评测系统网址是: http://www.tyvj.cn/最重要的一点是回答题目时,最好先回答第一题,那里面有提交源代码的注意事项。 下面是介绍,嫌麻烦就不要看了。来自 http://baike.baidu.com/view/3100833.htm?fr=ala0_1TYVJ 一个OJ(TYVJ在线测评系统) TYVJ成立于2009年10月20日,是一个面向所有信息学竞赛(NOIP,NOI,CTSC,WC,IOI)、 tyvj 4.20截图 国际大学生程序设计竞赛(ACM)以及编程爱好者准备的一个在线信息学网络平台。 最初的TYVJ是在^逸水之寒^サ(太原成成中学张浩千)的提议下,真空(陈鹏)提供服务器帮助,利用早年Vijos发布在网上的源码做成的一个仅供太原成成中学内部使用的题库。随着NOIP2009的过去,老牌的VIJOS无法稳定使用,TYVJ于2009年11月19日开始全面对外开放。当前TYVJ正在逐步摆脱VIJOS系统局限性,目前此计划已经取得很好的成效。在2010年2月25日,TYVJ正式更换了VIJOS系统传统的系统内核(VTS)而改为了由iceboy提供的全新VijosNT。全新的VijosNT采用云计算的技术,支持多对多的测评方式,将会比过去的内核更加安全。目前Burning Team人员正在计划制作属于TYvj自己的网页端,TYvj将会尽快脱离Vijos的所有系统。但是在这里还是感谢vijos的前期提供系统。 随着Tyvj的发展,目前已经有了有主站、begin初级题库(面向学习语言的朋友)、down数据下载站(下载测评数据)、solve题解站(解题报告发布)等站点,现在正在准备begin2题库,面向Noip普及组成员。同时在2010年7月15日正式对公众开放原题站(yuanti)提供各类竞赛原题以满足广大oier的做题需求。 Tyvj是一个完全公益的网站,不会收取大家任何费用,同时欢迎大家赞助。 其他详情请进入Tyvj网站查看!2023-07-09 17:33:021
Pascal中 zzzjj 怎么拍成jzjzz?
VIJOS上的题目嘛。比赛的题哦! 第1次交换位置1上的z和位置4上的j,变为jzzzj; 第2次交换位置4上的z和位置5上的j,变为jzzjz。 最后的串有2个“jz”子串。2023-07-09 17:33:095
noip普及组2012寻宝程序在vijos上一个点TLE,求救!(语言c++)
不会是评测机的问题吧~~~2023-07-09 17:33:291
本人今年高二,想拿明年NOIP省一(江苏省),此前没有基础,有希望吗?该怎么做?
首先纠正楼主一点,高中选手只能参加提高组比赛。用什么语言倒是无所谓,掌握语言只是学竞赛的前提之一。关键问题是楼主为什么想要拿NOIp省一,如果是为了保送上大学的话,我建议楼主一定慎重慎重再慎重。首先因为楼主只有明年一次机会,很难说能否如愿以偿,更何况江苏作为信息学强省,省内竞争本来就比其他地方更为激烈。如果楼主因此影响了文化课学习,而奥赛又一无所获,那么只能是故作徒劳。另外本来今年年初就传言说要取消NOIp保送资格,今年还未取消,但明年就说不准了。如果楼主辛辛苦苦奋斗一年,却得不到保送资格,那么也是得不偿失的。一年的时间对于弱省选手是很充裕的,基本上认真准备一年稳拿省一,但江苏作为强省,确实不好说,只能说准备一年有一定希望获得省一。如果楼主志在向计算机科学方面发展,或是能确保因省一而获益,那么我谨提供一下个人的学习方法:因为楼主说此前零基础,建议先花半个月把Pascal熟练掌握,然后就可以开始大量地做题了。信息学起步较晚,不像数理化一样形成了完备的教学体系,信息学奥赛很大程度上都是靠题海战术和自学成才。这里重点推荐两套题库,USACO和Vijos,前者系美国国家信息学训练基地(http://train.usaco.org),后者为湖南师大附中训练基地(http://www.vijos.cn)。其中USACO的题目最为系统,包括了所有NOIp会涉及到的算法和数据结构,但是全英文题目,不过国内很多网站都有中文译题,如NOCOW(http://www.nocow.cn)等,百度上也搜得到翻译。基本上只要把USACO前四章的题目都做完,NOIp省一就有八成把握了。语言、初赛、复赛(包括算法和数据结构)这三者所占用的学习时间比例大致应是1:2:10,理所当然复赛内容是最重要的重头戏,楼主一年的时间也应该主抓于此。但江苏作为强省初赛分数线往往很高,明年也一定要花时间准备复习初赛内容,不然准备一年却初赛没过那就亏大了。今天下午刚刚才结束了今年的初赛考试,不知道楼主有没有参加。能找到老师、前辈或者同学交流学习是做好的,一些基础起步的问题多请教请教可以节约不少弯路,多和同学讨论算法也能帮助自己进步。若没有人交流的话,我这里再推荐楼主一个论坛,信息学初学者之家(http://www.oibh.org/bbs),是国内目前最大的信息奥赛学生社区。所以,综上我给楼主的建议就是三条:谨慎考虑、勤加做题、步步为营。2023-07-09 17:33:361
人品具体指什么
人品,人的品质,人的品格。网络新意:人品爆发,形容一个人的运气极好。 目录 详细解释 基本解释 网络新意 详细解释人的品格 人的仪表 序——为什么要写人品导论 人品的定义与形成人品的概念与意义 人品的形成 人品的影响与利弊人品的不利影响 人品的有利影响 人品的估测与评价 人品的变化与操控人品第一定律 人品第二定律 人品第三定律 人品的变化因素 人为调节人品的技巧与方法 人品故事 详细解释 基本解释 网络新意 详细解释 人的品格 人的仪表 序——为什么要写人品导论 人品的定义与形成 人品的概念与意义 人品的形成 人品的影响与利弊 人品的不利影响 人品的有利影响 人品的估测与评价 人品的变化与操控 人品第一定律 人品第二定律 人品第三定律 人品的变化因素 人为调节人品的技巧与方法 人品故事展开 编辑本段详细解释 一样东西与某件事情相互对应的反应(可以理解成先付账还是先收货),呈现一件事物的某一个阶段的变化是好或者坏,如果并不能反应出付出和回报那么,就不是人品(那就是命) 人品只能反应人的心情好坏,不能改变一件事情。(本质是没有增减,也可以说时间可以弥补一切) 编辑本段基本解释 词目:人品 拼音:rén pǐn 1、[character]∶人的品质、人品很好 2、[looks]∶模样 编辑本段网络新意 运气。例词:人品爆发,形容一个人的运气极好。缩略词:RP 编辑本段详细解释 人的品格 南朝 梁沉约 《奏弹王源》:“ 源 虽人品庸陋,胄实参华。” 宋 黄庭坚 《濂溪诗序》:“ 舂陵 周茂叔 人品甚高,胸中洒落,如光风霁月。” 《节寰袁公传》:“公(袁可立)乃抗疏曰:‘夫卖直者退,则不直者进;沽名者斥,则毁名者庸。朝有不直、毁名之臣,则民生休戚、人品邪正,谁复为国家昌言乎?"”清 纪昀 《阅微草堂笔记·如是我闻三》:“缁徒执罪福之说,诱胁愚民,不以人品邪正分善恶,而以布施有无分善恶。” 周立波 《暴风骤雨》第一部十:“你看 萧队长 人品多高。” 人的仪表 《古今小说·杨谦之客舫遇侠僧》:“ 薛宣尉 见 杨知县 人品虽是瘦小,却有学问。”《红楼梦》第八回:“众人因素爱 秦氏 ,今见了 秦钟 是这般人品,也都欢喜。” 茅盾 《昙》五:“我也不是老朽昏庸的顽固派,只听媒人的话就说行;我让你自己也去看看人品,还不好么?” 编辑本段序——为什么要写人品导论 真的很早就了解到人品在信息学竞赛中举足轻重的作用了,加上前两天由于爆人品,考试爆零,星际被虐,交VIJOS莫名其妙unac……一切的一起,让我不得不把人品的理论系统撰写于书,以供参考,防止大家重蹈我的覆辙。 众所周知,在信息学竞赛中,除去算法数据结构使用,程序编写调试能力之外,排在第三的对比赛有至关重要作用的便是人品了,人品高的人即使不知道算法也能用随机,贪心,搜索等人品算法得到无比多的人品分数;相反,没人品的人,有时知道正确算法也写出了正确程序,也往往会因为缺少人品而无法得分。这样看来,系统研究人品的积累与损失,以及量化地分析它对比赛的结果的影响就显得十分重要了。 但是,目前国内外系统研究人品的论文和书籍都还很缺乏,也有很多优秀的OIer认识到了人品的重要性,但又因种种原因没能从事人品方面的研究,导致很多OIer因为对人品不了解而出现发挥失常,与奖牌失之交臂,为了让这种悲剧不再发生,我们有必要仔细研究人品了。 编辑本段人品的定义与形成 人品的概念与意义 人品是大家耳熟能详的一个词汇和概念,改革开放以来,随着市场经济的深入,竞争日益激烈,大家都在寻找在各自领域取胜的有效方法,人们考虑各种因素来提高自己成功的概率。 在这样的大背景下,便自然而然地产生了人品的概念,起初这个概念还是依附在其他因素上的一个附属品,但是当人们真正认识到它的影响时,才发现它是一个独立的体系。由于各地各文献内容对人品的定义都很模糊,也不够统一,因此笔者在此一学术的角度,客观的方式给出人品的严格定义: 人品:在一定时间和空间范围内独立于可见因素之外以不确定方式左右客观事物变化方式甚至规律的无形物质。 一直以来,大家觉得人品过于飘渺,不愿意研究它,这其实是由于没有真正意识到人品在客观世界物质变化规律中的重要意义,由于客观世界矛盾的普遍性存在,导致人品因素在事物发展变化的各个角落都发挥着不可忽略的决策性作用,一般来说,人品的意义主要有以下几点: 1、对客观世界的平衡作用 物质世界总是趋于平衡的,无论是能量|物质守衡定律,还是热力学第一,第二定律,都从侧面支持这一结论。但是在事物的各个方面个体之间不可能完全平衡,而又不一定能在不多的可见主观因素中使个体之间实现平衡(这正如背包-----双塔问题 不一定有解一样),但是只要有了人品,就能很方便地对客观世界进行微调,使世界不失和谐。 2、对主观行为的威慑作用 所谓善有善报,恶有恶报,但是很难说服一个即将做不厚道事情的人让他停止,因为我们不能具体说出他的不厚道行为到底为什么会对他自己也有害,但是现在有了最强有力的威慑武器:人品!当他做不厚道事情的时候,最需要考虑的不是别的,正是自己的人品银行。 3、对主观行为的激励作用 与第二条相类似,人品的存在可以很大程度上激励人做积累人品的厚道事情,这里不再赘述。 人品的形成 总的来说,人品的形成是多方面因素综合形象后的结果。对于人品形成的决定性因素,学术界一直没有公认的理论,目前比较被人接受的说法是: 人品的形成与平时做事的厚道程度的二次方根成正比。但是也有人质疑这种说法,原因是有时一个很厚道的人也会莫名其妙没人品,典型的案例是发生在中国四川一个学校的一个叫hj的人,平时很厚道,但是也遇到了没人品的情况,虽然这很罕见,但是不得不让人思考,因此,有学者认为:在一定时间和客观条件下,人品值与该人做事厚道程度之和的正弦函数有关。因此呈现出很让人费解的波动性图象,但是这种理论因为缺乏实验支持,目前还没有在学术界占领主导地位,但是笔者认为,这种理论应该更贴近人品形成机理的真实情况。(最新研究表明,波动正是人品趋于平衡的必然结果,由于一个人的人品太高的情况下,失去人品相对容易,所以会从波峰逐渐跌入波谷,反之亦然) 另外,人品的形成是有阶段性的,也就是说,有时候人品的变化并不是立竿见影的,但是人品升降因素的积累是不会停止的,在某个时期可能表现地不明显,但是宏观上的人品积累是一定的,这也就形成了人品的波动性改变,所以大家在某个人品低迷的时期也不应该停止对人品的积累。(就像力改变的是加速度,而不会对当前的速度有立竿见影的影响,不过长期的影响是深远而持久的) 另外客观世界满足一个基本定律————人品守衡定律,即人品不会凭空创生,也不会凭空湮灭,只会从一个人身上转移到另一个人身上,人品转移有以下两种方式: l 虐与被虐。 l 泡mm与mm被泡或者被mm泡。 这两条都很好理解,比如,某人星际被虐了,他的人品会有上升的倾向,另外,抢别人mm的人的人品会异常迅速地下降,所以大家一定要厚道。被mm泡人品会怎么样暂时还没有可以参考的案例…… 被mm泡一般人品会下降,少数会上升 编辑本段人品的影响与利弊 人品的不利影响 对于人品不足带来的不利影响,想必读者已经有了不少体会了,为了系统介绍,这里将不利影响列举一些例子如下: l 物品频繁损坏(如T43等) l 自行车胎被扎(汽车,电瓶车) l 泡mm失败(被无视,被抢夺等) l 考试爆0(考挂,发挥失常等) l 星际被虐(连续被虐很多局根据叠加原则将会出现更深远的影响) l 误机(堵车,迷路等) l FCR被冲 l 常回D-sat l 经常被one BY one l 派错part l Auto in 跑出去玩了 以上每一条虽然是人品不足带来的不利影响,但是客观上又可以积累人品,这也正体现了客观世界与人品的辨证关系。 从宏观上讲,上述事情也许并非全是坏事,但是本文讨论的主观色彩较重,对一些过于YY的东西不做讨论。 关于人品带来的麻烦的解决方法,学术界一直争论不休,企图认为改变人品变化趋势的想法,已经被实践证明是NPC,想预测人品的发展方向,也被论证是不可解问题。 那么,面对人品带来的不利影响,我们真的就束手无策了 吗?非也!我们有解决NP类问题的有力武器:星际!!!!在人品不好的时候,开High—AI调两家神族,遭电脑虐几盘,人品指数相信会有很大概率要++的,虽然这仍然是个部分算法,但是事实证明是很有效的,已经不亚于cqf的(sei)机贪心了…… 此外,另有极端人士为了平衡自己的人品,在关键时刻向别人赠送人民币,虽然被证明实际效果甚微,但是由于接受方会损失大量人品,所以这种行为也被认为是极度危险和边缘的。对于此损人不利己的行为,将会在以后对自己的人品走向产生不利影响。古时另有各种迷信活动来祈求获得人品,经证明一些行为是十分有效的,但是尚没有任何科学理论可以他们的成功,其中最著名的历史事件为诸葛亮借东风,这是以神秘的法事活动来获得人品成功的典型例子,不但说明了我国的人品研究在很早的时候就有开展,并且代表了当时的人品学说已经发展到相当先进的阶段,后来由于战乱和历史原因,人品学逐渐没落和淡出国人的视野,在近代才又被重新提出和加以研究,但想恢复当年的水平还任重而道远。 人品的有利影响 对于希望利用人品以追求更高品质生活的读者来说,人品的有利影响也是应该了解的重要问题之一。关于人品的有利影响,对于大部分本人读者来说,不外乎下面两个方面: l 考试获得理想的分数 l 泡MM获得阶段性成果 总结起来便是工作方面和生活方面,从中可以看出,人品对于生产生活的各个方面如果合理加以利用都可以达到相当大的有利效果。所以,“天下之大,人品独尊”,若存在一种方式,可以让一个人长期保有相当量的人品,那么此人便可以独步天下,无人能当,足以可见人品的威力。(也有学者认为本情况是不可能成为现实的,不过并没有合理的证明)不过关于高人品独步天下的例子,笔者实在难以获得,这也从侧面反映了人品易失难获的性质,从而说明了大自然趋于平衡的典型特征。 编辑本段人品的估测与评价 1、人品的单位系统 人品单位 德,符号De. 人品感应系数单位 品,符号Pn. 人品场强度单位 运,符号 Yn. 人品常量单位 米每品,符号 m/Pn; 定义:De是等量与一次雷锋叔叔帮战友看倒车的人品的十分之一其余量,随此计算。 2、人品的估测方法 刘汝佳大牛曾在2008.5.12之前某一天深夜灵感爆发,在国家集训队群中公布了自己对人品的研究:人品和请客次数乘以时间的三次方有一定关系 以下是来自Azrle的个人见解:Erp的变化量大小插入数学公式 Erp = ( | w u2212 f | + 1) / P w表示期待事件发生的次数,如果不想它发生一次那么w=-1,超级不希望它发生w=-100000,f是事件的频数,P是事件的概率。此公式可用来计算瞬间转移的人品值,例如:一个人中了500万,中奖的概率是1/1000000,想这一次中奖,那么,E人品=1000000(z是他有多期待在家中500万),也就是说,他瞬间损失了这么多人品势能。如果你不去想,即w=0,那么将会损失更多人品(可以这么理解,你无所谓的事情都发生了,那你肯定要多损失点人品啦)。再例如:帮老奶奶过街,因为碰到这样的情况概率不大(也就是说机会难得啊,如果是一般的让座估计就没这么多人品赚了),所以得到的E人品也就大咯。 据Lord Beyond Yahweh 的研究,人品是一个标量场。每个精神体会在其周围空间激起人品场,其强度随距离的增加呈一次方反比递减。 d(rp)/d(P)=Lrp*rp/x。 Lrp,为人品常量,在不同文化环境内,有不同的Lrp值。每个精神体有一个人品感应系数P ,P乘以此处人品场强度即时此人此时的人品值的数学期望,而人品的具体值实在其周围空间以正态形式分布,而且符合测不准原理。具体定义: 人品单位 德,符号De. 人品感应系数单位 品,符号Pn. 人品场强度单位运,符号 Yn. 人品常量单位 米每品,符号 m/Pn; 另:人品场的梯度是人品流动速度的场。于是其速度随距离的增加呈二次方反比递减。 然而, 一个人的人品势能很低,并不代表人品能量就会向他流动,因为这些能量还受到周边人、物的人品引力制约。只能说,人品低的人在同等条件下更容易接受人品能量,从而升高人品势能;人品势能高容易失去人品(多数以无用的形式流向大自然,因为这是必然事件,那么),为了维持较高的人品势,我们就要不断的补充。但是人品势能高,并不代表就会有你说期待的好事发生,有可能这些人品以其他你所不期待的形式释放了,我们称作为人品亏损,这就取决于你的人品利用率了。所以,我们在汲取人品的同时,还要锻炼我们的人品利用率。 这里要说一个自然损失,因为这是必然时间,所以P=1,那么人品的损失量就直接和你的w值有关了,也就是,如果你正确认识了这种必然性,你的人品只会损失1,如果你非常不想让它损失那么你将损失更多的人品能量,所以,调整心态是很重要的啊~! 当然,这个评估体系还有待完善。 比如个人的道德修养很低导致人品低是毋庸置疑的。但是研究发现,由于道德败坏因素所激发的极低的人品场并不能明显导致人品向其流动。而且,进一步实验表明,在外界条件(时间、文化环境、周边人品场强度分布、人的意识)相同的情况下,相同强度的人品场所造成的人品流动有明显差异。 人品学者Roma这样解释:人品场的强度只是造成人品流动的一个因素,我们目前只能由已知的人品场分布状态推测人品大概的流动趋势。而人品的流动速度还取决于其他诸如个人道德修养(单位:道 符号Dao)等参数。而具体的计算公式尚未明确。 编辑本段人品的变化与操控 人品的几大定律研究认为,人品学也是科学,即也满足科学的基本原理: 对称性原理 守恒原理 平衡原理 叠加原理 详见 LBY(Lord Beyond Yahweh的《科学的一些基本原理》一文) 人品第一定律 人品是守恒的,它既不会凭空产生,也不会凭空消失 宇宙创生之初,与各大基本粒子同时由爆炸奇点生成的一大暗物质种类就是人品。经过笔者的多年探究和无数实验,配合与史蒂芬u2022霍金的理论研究合作,已经基本从理论高度证明了人品第一定律,也称为"人品守恒定律"。 这一定理的理解往往不像物理学中的“热力学第一定律”那样好理解,因为在实际生产生活实践中,往往会发现某人的人品大量减少,但是并没有发现某人的人品有明显的提升,所以也导致在很长一段时间内大量研究人员质疑人品守恒定律的正确性。进一步研究发现,人品的存在和守恒是确定的只是由于绝大多数人品往往存在于生物体之外而以“自由人品”的形式游离于宇宙空间,所以,以上那种情况仅仅表明某人的人品由于自身原因散佚于宇宙空间,却没有人从空间中汲取人品,从而导致有效人品减少,也就是发挥作用的人品减少了,但并没有影响人品本身的守恒。 人品第二定律 人品不可以从低人品物体传向高人品物体而不引起其他变化。但由于人品的不确定性,人品可以从人品的数学期望低的物体传向高人品数学期望物体,这与第二定律不矛盾。 人品第三定律 对大量的事实的分析表明,绝对没人品不可能达到。 人品的变化因素 总的来说,人品的变化因素不可控因素比可控因素占的因素还多,发生在身边的任何事都可能改变你的人品,正是因为这样,人品才经常变化于无形中,但是这不是我们放弃研究人品的理由,要在复杂的情况中提炼出简单的规律,化繁为简。笔者经过多年实践观察总结,列出了如下表格描述各种因素与人品的变化关系: 事件 对人品影响(单位:fs) 考试爆0 +6 星际,羽毛球等被虐 +5 扶老奶奶过街 +3 …… …… (注:单位“fs“的定义为:vijos上AC一道题所需要的人品的量) 由上述表格可以看出,积累人品是不容易的,但是积累的人品却很容易在不经意之间丢失,(所谓“大自然厌恶高人品”,也就是说,人品越高的人,丢失人品也就会显得越容易)。这就是为什么很多人抱怨自己的人品从来就没好过,那是因为他们好不容易有点人品了,却由于自己不小心又做的损人品的事情而把宝贵的人品丢失了。(人品易挥发) 人为调节人品的技巧与方法 说实话,对这一节的内容笔者没有十分的把握,因为笔者本人对这部分内容一直都很困惑,我希望能通过一些人为手段调节可怜的人品,但是理论跟实践的差距往往相当大,我理论分析总结的规律在实践中有时并不能行通,就像我有时候可以地遵守交通规则,不闯红灯,听妈妈的话等等等等,原本以为这样可以积累人品,无奈考试还是要爆0,说白了就是人品对人似乎有天生的抵触情节,最经典的例子是与笔者同校的一个叫LKQ(化名)的同学在NOI之前不幸将自己的手机搞丢,本以为自己人品会增长到一定的程度,以帮助自己在NOI上获得较好的成绩,结果事与愿违,NOI还是不幸考挂,所以我们分析一个现实生活中的人品问题,一定不能拘泥于某一些事情对于人品的影响,而应该纵览全局,客观考虑各种因素的影响,才能最后得出准确的结论,事实证明那位同学在NOI上被室友塞了满满一抽屉的硬币,硬币虽小,但对人品的影响却是巨大的,正如刚才论述的,人品失去容易获得难,虽然手机的价值远大于硬币,但是对于失去手机人品有所增长的这位仁兄来说,获得硬币所损失的人品更是一个恐怖的数字。所以要客观和全面地分析问题,才能获得准确和有效的结论。 但是我们不能因此就放弃对人品的调节,我们需要持之以恒的调节人品。因为根据SW的经验来看,追MM、谈恋爱等事情需要耗费巨大的人品。例如:SW和其女同学一起吃完KFC出去的时候,其女同学说也许我们出去就会被汽车一起撞死,为了避免这种悲剧发生,SW不得不支付大量人品……所以各位需要不断的累积人品,来应付各种突发状况…… 人品之变诈几何哉?止增笑耳。 人品的奇律任何理论都有其局限性,当然经典人品理论也是一样,某些时候人品会从某个人身上大量的涌现(俗称:人品爆发),而此人之前的人品值表现平常甚至很低或者显示为负。这种现象称为人品的奇律。人品爆发相当罕见,因此研究甚少,成果有待完善。最近研究表明:人品爆发一般是一种其概率与自己希望爆发的程度2次方成反比的情况。 人品故事 最近研究表明,人品对包括物理竞赛在内的各门竞赛,也有极大影响。 Lord Beyond Yahweh在参加今年物理竞赛时,计算所谓16小时轨道的实际周期,算得7.8..小时,感觉不对,乘以2=15.77后写了上去,竟对了,这与他最近一直以宇宙公民的要求要求自己——节约能源,减少宇宙的熵增,推迟宇宙灭亡。2023-07-09 17:33:431
[PASCAL]谁拿了最多奖学金
本题题目有点长..基本思路:首先用ansistring读入每一行并作处理,可先用pos函数找到空格然后将1~pos的值-1截下作为名字nn,接下来2个分数都是将前面空格前的删掉继续用pos找空格,然后对空格前的字符串长度作处理,并将分数记为n1、n2,再接下来同样处理得出n3、n4、n5,然后就按照题目要求计算出当前人的奖学金s,然后与之前最大值max比较,若比max大那么就将max:=s同时将该同学名字nn存如maxn中,并将s加到总和sum中,最后就可以按要求输出max,maxn,sum了.这道题很早做的..已经忘了很多,程序太长不好找错..只能讲讲思路了.附我以前做的程序,略有些复杂,可优化(与上述变量无关):var a,b,c,l,i,j,n,sum,max,s,ss:longint;nn,n1,n2,n3,n4,n5:ansistring;beginreadln(n);sum:=0;max:=0;//初始化for i:=1 to n do begins:=0;//还是初始化readln(n4);l:=length(n4);n1:="";//仍然是初始化,我是读一行做一行..for j:=1 to l doif n4[j]<>" " then n1:=n1+n4[j] else begin ss:=j;break;end;//找名字,用pos看上去会清楚点..n5:="";for j:=ss+1 to l doif n4[j]<>" " then n5:=n5+n4[j] else begin ss:=j;break;end;if length(n5)=1 then a:=ord(n5[1])-ord("0") elseif length(n5)=2 then a:=(ord(n5[1])-ord("0"))*10+ord(n5[2])-ord("0") elseif length(n5)=3 then a:=100;//对分数的字符长度判断并得出分数n5:="";for j:=ss+1 to l doif n4[j]<>" " then n5:=n5+n4[j] else begin ss:=j;break;end;if length(n5)=1 then b:=ord(n5[1])-ord("0") elseif length(n5)=2 then b:=(ord(n5[1])-ord("0"))*10+ord(n5[2])-ord("0") elseif length(n5)=3 then b:=100;//对第二个分数的处理,同上n2:="";n3:="";n2:=n4[ss+1];n3:=n4[ss+3];//接下来2个Y或Nss:=ss+4;n5:="";for j:=ss+1 to l doif n4[j]<>" " then n5:=n5+n4[j];if length(n5)=1 then c:=ord(n5[1])-ord("0") elseif length(n5)=2 then c:=(ord(n5[1])-ord("0"))*10+ord(n5[2])-ord("0");//求论文数if (a>80) and (c>=1) then s:=s+8000;if (a>85) and (b>80) then s:=s+4000;if a>90 then s:=s+2000;if (a>85) and (n3="Y") then s:=s+1000;if (b>80) and (n2="Y") then s:=s+850;sum:=sum+s;if s>max then begin max:=s;nn:=n1;end;end;//按照题目要求做writeln(nn);writeln(max);writeln(sum);//输出答案end.2023-07-09 17:33:504
求汕头大学 oj 能上的网址 或除了vijos其它收录noip联赛题目的在线评测系统
zju可以上吧 我就在那儿做的2023-07-09 17:34:151
离散化的举例解释
如果说OIBH问得最多的问题是二分图,那么“现在”问得最多的算是离散化了。对于“什么是离散化”,搜索帖子你会发现有各种说法,比如“排序后处理”、“对坐标的近似处理”等等。哪个是对的呢?哪个都对。关键在于,这需要一些例子和不少的讲解才能完全解释清楚 。离散化是程序设计中一个非常常用的技巧,它可以有效的降低时间和空间复杂度。其基本思想就是在众多可能的情况中“只考虑我需要用的值”。下面我将用三个例子说明,如何运用离散化改进一个低效的,甚至根本不可能实现的算法。《算法艺术与信息学竞赛》中的计算几何部分,黄亮举了一个经典的例子,我认为很适合用来介绍离散化思想。这个问题是UVA10173题目意思很简单,给定平面上n个点的坐标,求能够覆盖所有这些点的最小矩形面积。这个问题难就难在,这个矩形可以倾斜放置(边不必平行于坐标轴)。这里的倾斜放置很不好处理,因为我们不知道这个矩形最终会倾斜多少度。假设我们知道这个矩形的倾角是α,那么答案就很简单了:矩形面积最小时四条边一定都挨着某个点。也就是说,四条边的斜率已经都知道了的话,只需要让这些边从外面不断逼近这个点集直到碰到了某个点。你不必知道这个具体应该怎么实现,只需要理解这可以通过某种方法计算出来,毕竟我们的重点在下面的过程。我们的算法很显然了:枚举矩形的倾角,对于每一个倾角,我们都能计算出最小的矩形面积,最后取一个最小值。这个算法是否是正确的呢?我们不能说它是否正确,因为它根本不可能实现。矩形的倾角是一个实数,它有无数种可能,你永远不可能枚举每一种情况。我们说,矩形的倾角是一个“连续的”变量,它是我们无法枚举这个倾角的根本原因。我们需要一种方法,把这个“连续的”变量变成一个一个的值,变成一个“离散的”变量。这个过程也就是所谓的离散化。我们可以证明,最小面积的矩形不但要求四条边上都有一个点,而且还要求至少一条边上有两个或两个以上的点。试想,如果每条边上都只有一个点,则我们总可以把这个矩形旋转一点使得这个矩形变“松”,从而有余地得到更小的矩形。于是我们发现,矩形的某条边的斜率必然与某两点的连线相同。如果我们计算出了所有过两点的直线的倾角,那么α的取值只有可能是这些倾角或它减去90度后的角(直线按“”方向倾斜时)这么C(n,2)种。我们说,这个“倾角”已经被我们“离散化”了。虽然这个算法仍然有优化的余地,但此时我们已经达到了本文开头所说的目的。对于某些坐标虽然已经是整数(已经是离散的了)但范围极大的问题,我们也可以用离散化的思想缩小这个规模。搞模拟赛Vijos似乎火了一把,我就拿两道Vijos的题开刀。VOJ1056 永远是离散化的经典问题。大意是给定平面上的n个矩形(坐标为整数,矩形与矩形之间可能有重叠的部分),求其覆盖的总面积。平常的想法就是开一个与二维坐标规模相当的二维Boolean数组模拟矩形的“覆盖”(把矩形所在的位置填上True)。可惜这个想法在这里有些问题,因为这个题目中坐标范围相当大(坐标范围为-10^8到10^8之间的整数)。但我们发现,矩形的数量n<=100远远小于坐标范围。每个矩形会在横纵坐标上各“使用”两个值,100个矩形的坐标也不过用了-10^8到10^8之间的200个值。也就是说,实际有用的值其实只有这么几个。这些值将作为新的坐标值重新划分整个平面,省去中间的若干坐标值没有影响。我们可以将坐标范围“离散化”到1到200之间的数,于是一个200*200的二维数组就足够了。实现方法正如本文开头所说的“排序后处理”。对横坐标(或纵坐标)进行一次排序并映射为1到2n的整数,同时记录新坐标的每两个相邻坐标之间在离散化前实际的距离是多少。这道题同样有优化的余地。最后简单讲一下计算几何以外的一个运用实例(实质仍然是坐标的离散)。VOJ1238 中,标程开了一个与时间范围一样大的数组来储存时间段的位置。这种方法在空间上来看十分危险。一旦时间取值范围再大一点,盲目的空间开销将导致Memory Limit Exceeded。我们完全可以采用离散化避免这种情况。我们对所有给出的时间坐标进行一次排序,然后同样用时间段的开始点和结束点来计算每个时刻的游戏数,只是一次性加的经验值数将乘以排序后这两个相邻时间点的实际差。这样,一个1..n的数组就足够了。离散化的应用相当广泛,以后你会看到还有很多其它的用途。2023-07-09 17:34:241
关于NOI的问题
NOI 六个题,分day1,day2. 一试三个题。和vijos相比,个人感觉应该是3--5左右。2023-07-09 17:34:473
找大牛纠错 pascal 简单题 郁闷
program c1217;var st:ansistring; l:longint; f21:array [1..1000000,1..2] of longint;procedure Init;var ch:char;beginst:="";while not eof dobeginread(ch);if (ch="W") or (ch="L") or (ch="E") then st:=st+ch;end;if st[1]="E" then begin writeln(0,":",0); writeln; writeln(0,":",0); halt; end;l:=length(st)-1;end;procedure Love;var i,t1,t2,h:longint;ch:char;beginh:=1;t1:=0;t2:=0;i:=1;repeatch:=st[i];if ch="W" then begin inc(t1);inc(f21[h,1]); end;if ch="L" then begin inc(t2);inc(f21[h,2]); end;if ((t1>=11) or (t2>=11)) and (abs(t1-t2)>1) then begin writeln(t1,":",t2); t1:=0; t2:=0; end; if ((f21[h,1]>=21) or (f21[h,2]>=21)) and (abs(f21[h,1]-f21[h,2])>1) then inc(h);inc(i);until ch="E";if (l mod 11=0) then writeln(0,":",0) else writeln(t1,":",t2);writeln;for i:=1 to h-1 dowriteln(f21[i,1],":",f21[i,2]);if (l mod 21=0) then writeln(0,":",0) else writeln(f21[h,1],":",f21[h,2]);end;beginfillchar(f21,sizeof(f21),0);Init;Love;end.2023-07-09 17:34:541
人品问题怎么理解,人品问题有没有分类?
南朝 梁 沉约 《奏弹王源》:“ 源 虽人品庸陋,胄实参华。” 宋 黄庭坚 《濂溪诗序》:“ 舂陵 周茂叔 人品甚高,胸中洒落,如光风霁月。” 《节寰袁公传》:“公(袁可立)乃抗疏曰:‘夫卖直者退,则不直者进;沽名者斥,则毁名者庸。朝有不直、毁名之臣,则民生休戚、人品邪正,谁复为国家昌言乎?"”清 纪昀 《阅微草堂笔记·如是我闻三》:“缁徒执罪福之说,诱胁愚民,不以人品邪正分善恶,而以布施有无分善恶。” 周立波 《暴风骤雨》第一部十:“你看 萧队长 人品多高。” 1、人品第一定律 人品是守恒的,它既不会凭空产生,也不会凭空消失 宇宙创生之初,与各大基本粒子同时由爆炸奇点生成的一大暗物质种类就是人品。经过笔者的多年探究和无数实验,配合与史蒂芬61霍金的理论研究合作,已经基本从理论高度证明了人品第一定律,也称为"人品守恒定律"。 这一定理的理解往往不像物理学中的“热力学第一定律”那样好理解,因为在实际生产生活实践中,往往会发现某人的人品大量减少,但是并没有发现某人的人品有明显的提升,所以也导致在很长一段时间内大量研究人员质疑人品守恒定律的正确性。进一步研究发现,人品的存在和守恒是确定的只是由于绝大多数人品往往存在于生物体之外而以“自由人品”的形式游离于宇宙空间,所以,以上那种情况仅仅表明某人的人品由于自身原因散佚于宇宙空间,却没有人从空间中汲取人品,从而导致有效人品减少,也就是发挥作用的人品减少了,但并没有影响人品本身的守恒。 2、人品第二定律 人品不可以从低人品物体传向高人品物体而不引起其他变化。但由于人品的不确定性,人品可以从人品的数学期望低的物体传向高人品数学期望物体,这与第二定律不矛盾。 3、人品第三定律 对大量的事实的分析表明,绝对没人品不可能达到。 4、人品的变化因素 总的来说,人品的变化因素不可控因素比可控因素占的因素还多,发生在身边的任何事都可能改变你的人品,正是因为这样,人品才经常变化于无形中,但是这不是我们放弃研究人品的理由,要在复杂的情况中提炼出简单的规律,化繁为简。笔者经过多年实践观察总结,列出了如下表格描述各种因素与人品的变化关系: 事件对人品影响(单位:fs)考试爆0+6星际,羽毛球等被虐+5扶老奶奶过街+3…………(注:单位“fs“的定义为:vijos上AC一道题所需要的人品的量) 由上述表格可以看出,积累人品是不容易的,但是积累的人品却很容易在不经意之间丢失,(所谓“大自然厌恶高人品”,也就是说,人品越高的人,丢失人品也就会显得越容易)。这就是为什么很多人抱怨自己的人品从来就没好过,那是因为他们好不容易有点人品了,却由于自己不小心又做的损人品的事情而把宝贵的人品丢失了。(人品易挥发) 5、人为调节人品的技巧与方法 说实话,对这一节的内容笔者没有十分的把握,因为笔者本人对这部分内容一直都很困惑,我希望能通过一些人为手段调节可怜的人品,但是理论跟实践的差距往往相当大,我理论分析总结的规律在实践中有时并不能行通,就像我有时候可以地遵守交通规则,不闯红灯,听妈妈的话等等等等,原本以为这样可以积累人品,无奈考试还是要爆0,说白了就是人品对人似乎有天生的抵触情节,最经典的例子是与笔者同校的一个叫LKQ(化名)的同学在NOI之前不幸将自己的手机搞丢,本以为自己人品会增长到一定的程度,以帮助自己在NOI上获得较好的成绩,结果事与愿违,NOI还是不幸考挂,所以我们分析一个现实生活中的人品问题,一定不能拘泥于某一些事情对于人品的影响,而应该纵览全局,客观考虑各种因素的影响,才能最后得出准确的结论,事实证明那位同学在NOI上被室友塞了满满一抽屉的硬币,硬币虽小,但对人品的影响却是巨大的,正如刚才论述的,人品失去容易获得难,虽然手机的价值远大于硬币,但是对于失去手机人品有所增长的这位仁兄来说,获得硬币所损失的人品更是一个恐怖的数字。所以要客观和全面地分析问题,才能获得准确和有效的结论。 但是我们不能因此就放弃对人品的调节,我们需要持之以恒的调节人品。因为根据SW的经验来看,追MM、谈恋爱等事情需要耗费巨大的人品。例如:SW和其女同学一起吃完KFC出去的时候,其女同学说也许我们出去就会被汽车一起撞死,为了避免这种悲剧发生,SW不得不支付大量人品……所以各位需要不断的累积人品,来应付各种突发状况…… 人品之变诈几何哉?止增笑耳。 人品的奇律任何理论都有其局限性,当然经典人品理论也是一样,某些时候人品会从某个人身上大量的涌现(俗称:人品爆发),而此人之前的人品值表现平常甚至很低或者显示为负。这种现象称为人品的奇律。人品爆发相当罕见,因此研究甚少,成果有待完善。最近研究表明:人品爆发一般是一种其概率与自己希望爆发的程度2次方成反比的情况。 6、人品故事 最近研究表明,人品对包括物理竞赛在内的各门竞赛,也有极大影响。 Lord Beyond Yahweh在参加今年物理竞赛时,计算所谓16小时轨道的实际周期,算得7.8..小时,感觉不对,乘以2=15.77后写了上去,竟对了,这与他最近一直以宇宙公民的要求要求自己——节约能源,减少宇宙的熵增,推迟宇宙灭亡。2023-07-09 17:35:021
我在学C++,想参加全国青少年信息学奥林匹克竞赛
好像每年11月左右会有个省赛吧,如果十分优秀的话,就有希望进入国家队。想要保送的话,至少要达到省一等奖吧。这里有信息学比赛的练习题,有空可以坐下,里面会有很多高手,可以多交流。http://www.vijos.cn/还有http://www.oibh.org/bbs/ 这里可能会有辽宁的选手,你们可以交流下。学C++可以看C++primer 或者谭浩强写的C++课本,不过好像大部分参加信息学比赛的学生都比较喜欢用Pascal。希望对你有帮助。2023-07-09 17:35:094
关于信息学奥林匹克竞赛的若干问题(高中)
我高中刚毕业,也是搞信息竞赛的。C++是可以使用的,不过有不少限制,如对STL库的限制等。C++是面向对象的语言,但NOIP完全用不上面向对象的设计思想。对于NOIP这种考算法的比赛来看,学好面向过程的语言才是关键,因为NOIP的考核主要是看算法和数据结构,这正符合面向过程语言的设计思想,而C++的核心是类,是对象,这与NOIP要考的知识相差很大。如果你已经有了C++的基础,那么完全可以用C++参加NOIP。不过与C和Pascal选手比起来,并没有什么优势。关键还在于对算法和数据结构的积累,以及扎扎实实的练习。当然,如果你愿意,也可以用C参加竞赛。其实两个是差不多的,只要稍微注意一下竞赛大纲对C++的限制即可。NOIP常用的书目有《奥赛经典》的基础篇、提高篇、数据结构篇等。最好买详细介绍数据结构和算法的书,这样的书也很多,清华大学出版社的不错。另外,信息学训练常用的网站:http://www.vijos.cnhttp://www.oibh.org (有所有网站的比赛消息发布等)http://train.usaco.org(最后一个是英文的,可以去http://www.nocow.cn/index.php/USACO_Training看着翻译做。)其他的也非常多。信息学竞赛也需要大量的做题量。另外要多找老师咨询,弄清楚有关比赛的基本知识。我初中参加普及组比赛时完全不会文件操作,结果0分……也应该看一下NOIP近年发布的大纲以了解相关信息。祝你好运!2023-07-09 17:35:183
谁有动态规划的题目(编程的进)
1. 最长公共子序列 一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说,若给定序列X=<x1, x2,…, xm>,则另一序列Z=<z1, z2,…, zk>是X的子序列是指存在一个严格递增的下标序列 <i1, i2,…, ik>,使得对于所有j=1,2,…,k有 2. 计算矩阵连乘积 在科学计算中经常要计算矩阵的乘积。矩阵A和B可乘的条件是矩阵A的列数等于矩阵B的行数。若A是一个p×q的矩阵,B是一个q×r的矩阵,则其乘积C=AB是一个p×r的矩阵。由该公式知计算C=AB总共需要pqr次的数乘。其标准计算公式为: 3. 凸多边形的最优三角剖分 多边形是平面上一条分段线性的闭曲线。也就是说,多边形是由一系列首尾相接的直线段组成的。组成多边形的各直线段称为该多边形的边。多边形相接两条边的连接点称为多边形的顶点。若多边形的边之间除了连接顶点外没有别的公共点,则称该多边形为简单多边形。一个简单多边形将平面分为3个部分:被包围在多边形内的所有点构成了多边形的内部;多边形本身构成多边形的边界;而平面上其余的点构成了多边形的外部。当一个简单多边形及其内部构成一个闭凸集时,称该简单多边形为凸多边形。也就是说凸多边形边界上或内部的任意两点所连成的直线段上所有的点均在该凸多边形的内部或边界上。 通常,用多边形顶点的逆时针序列来表示一个凸多边形,即P=<v0 ,v1 ,… ,vn-1>表示具有n条边v0v1,v1v2,… ,vn-1vn的一个凸多边形,其中,约定v0=vn 。 若vi与vj是多边形上不相邻的两个顶点,则线段vivj称为多边形的一条弦。弦 将多边形分割成凸的两个子多边形<vi ,vi+1 ,… ,vj>和<vj ,vj+1 ,… ,vi>。多边形的三角剖分是一个将多边形分割成互不重迭的三角形的弦的集合T。如图是一个凸多边形的两个不同的三角剖分。 凸多边形最优三角剖分的问题是:给定一个凸多边形P=<v0 ,v1 ,… ,vn-1>以及定义在由多边形的边和弦组成的三角形上的权函数ω。要求确定该凸多边形的一个三角剖分,使得该三角剖分对应的权即剖分中诸三角形上的权之和为最小。 可以定义三角形上各种各样的权函数W。例如:定义ω(△vivjvk)=|vivj|+|vivk|+|vkvj|,其中,|vivj|是点vi到vj的欧氏距离。相应于此权函数的最优三角剖分即为最小弦长三角剖分。(注意:解决此问题的算法必须适用于任意的权函数) 4. 防卫导弹 一种新型的防卫导弹可截击多个攻击导弹。它可以向前飞行,也可以用很快的速度向下飞行,可以毫无损伤地截击进攻导弹,但不可以向后或向上飞行。但有一个缺点,尽管它发射时可以达到任意高度,但它只能截击比它上次截击导弹时所处高度低或者高度相同的导弹。现对这种新型防卫导弹进行测试,在每一次测试中,发射一系列的测试导弹(这些导弹发射的间隔时间固定,飞行速度相同),该防卫导弹所能获得的信息包括各进攻导弹的高度,以及它们发射次序。现要求编一程序,求在每次测试中,该防卫导弹最多能截击的进攻导弹数量,一个导弹能被截击应满足下列两个条件之一: a)它是该次测试中第一个被防卫导弹截击的导弹; b)它是在上一次被截击导弹的发射后发射,且高度不大于上一次被截击导弹的高度的导弹。 输入数据:第一行是一个整数n,以后的n各有一个整数表示导弹的高度。 输出数据:截击导弹的最大数目。 5. 石子合并 在一个圆形操场的四周摆放着n堆石子(n<= 100),现要将石子有次序地合并成一堆。规定每次只能选取相邻的两堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。编一程序,由文件读入堆栈数n及每堆栈的石子数(<=20)。 选择一种合并石子的方案,使得做n-1次合并,得分的总和最小; 输入数据: 第一行为石子堆数n; 第二行为每堆的石子数,每两个数之间用一个空格分隔。 输出数据: 从第一至第n行为得分最小的合并方案。第n+1行是空行.从第n+2行到第2n+1行是得分最大合并方案。每种合并方案用n行表示,其中第i行(1<=i<=n)表示第i次合并前各堆的石子数(依顺时针次序输出,哪一堆先输出均可)。要求将待合并的两堆石子数以相应的负数表示。 Sample Input 4 4 5 9 4 Sample Output -4 5 9 -4 -8 -5 9 -13 -9 22 4 -5 -9 4 4-14 -4 -4 -18 22 6. 最小代价子母树 设有一排数,共n个,例如:22 14 7 13 26 15 11。任意2个相邻的数可以进行归并,归并的代价为该两个数的和,经过不断的归并,最后归为一堆,而全部归并代价的和称为总代价,给出一种归并算法,使总代价为最小。 输入、输出数据格式与“石子合并”相同。 Sample Input 4 12 5 16 4 Sample Output -12 -5 16 4 17 -16 -4 -17 -20 37 7. 商店购物 某商店中每种商品都有一个价格。例如,一朵花的价格是2 ICU(ICU 是信息学竞赛的货币的单位);一个花瓶的价格是5 ICU。为了吸引更多的顾客,商店提供了特殊优惠价。特殊优惠商品是把一种或几种商品分成一组。并降价销售。例如:3朵花的价格不是6而是5 ICU;2个花瓶加1朵花是10 ICU不是12 ICU。 编一个程序,计算某个顾客所购商品应付的费用。要充分利用优惠价以使顾客付款最小。请注意,你不能变更顾客所购商品的种类及数量,即使增加某些商品会使付款总数减小也不允许你作出任何变更。假定各种商品价格用优惠价如上所述,并且某顾客购买物品为:3朵花和2个花瓶。那么顾客应付款为14 ICU因为: 1朵花加2个花瓶优惠价:10 ICU 2朵花正常价:4 ICU 输入数据:第一个文件INPUT.TXT描述顾客所购物品(放在购物筐中);第二个文件描述商店提供的优惠商品及价格(文件名为OFF ER.TXT)。 两个文件中都只用整数。 第一个文件INPUT.TXT的格式为:第一行是一个数字B(0≤B≤5),表示所购商品种类数。下面共B行,每行中含3个数C,K,P。 C 代表商品的编码(每种商品有一个唯一的编码),1≤C≤999。K代表该种商品购买总数,1≤K≤5。P 是该种商品的正常单价(每件商品的价格),1≤P≤999。请注意,购物筐中最多可放5*5=25件商品。 第二个文件OFFER.TXT的格式为:第一行是一个数字S(0≤S≤9 9),表示共有S 种优惠。下面共S行,每一行描述一种优惠商品的组合中商品的种类。下面接着是几个数字对(C,K),其中C代表商品编码,1≤C≤9 99。K代表该种商品在此组合中的数量,1≤K≤5。本行最后一个数字P(1≤ P≤9999)代表此商品组合的优惠价。当然, 优惠价要低于该组合中商品正常价之总和。 输出数据:在输出文件OUTPUT.TXT中写 一个数字(占一行),该数字表示顾客所购商品(输入文件指明所购商品)应付的最低货款。 8. 旅游预算 一个旅行社需要估算乘汽车从某城市到另一城市的最小费用,沿路有若干加油站,每个加油站收费不一定相同。旅游预算有如下规则: 若油箱的油过半,不停车加油,除非油箱中的油不可支持到下一站;每次加油时都加满;在一个加油站加油时,司机要花费2元买东西吃;司机不必为其他意外情况而准备额外的油;汽车开出时在起点加满油箱;计算精确到分(1元=100分)。编写程序估计实际行驶在某路线所需的最小费用。 输入数据:从当前目录下的文本文件“route.dat”读入数据。按以下格式输入若干旅行路线的情况: 第一行为起点到终点的距离(实数) 第二行为三个实数,后跟一个整数,每两个数据间用一个空格隔开。其中第一个数为汽车油箱的容量(升),第二个数是每升汽油行驶的公里数,第三个数是在起点加满油箱的费用,第四个数是加油站的数量。(〈=50)。接下去的每行包括两个实数,每个数据之间用一个空格分隔,其中第一个数是该加油站离起点的距离,第二个数是该加油站每升汽油的价格(元/升)。加油站按它们与起点的距离升序排列。所有的输入都有一定有解。 输出数据:答案输出到当前目录下的文本文件“route.out”中。该文件包括两行。第一行为一个实数和一个整数,实数为旅行的最小费用,以元为单位,精确到分,整数表示途中加油的站的N。第二行是N个整数,表示N个加油的站的编号,按升序排列。数据间用一个空格分隔,此外没有多余的空格。 Sample Input 516.3 38.09 1 15.7 22.1 20.87 3 2 125.4 1.259 297.9 1.129 345.2 0.999 Sample Output 38.09 1 22023-07-09 17:35:251
关于参加青少年信息学奥赛联赛(noip)
(1)不能带计算器 (2)只要背些关键的,如:ord(‘A")=65 (3)笔(草稿纸最好准备,主办方有可能不会给你发草稿纸) (4)知道就可以了 (5)Ada Lovelace (6)32 (7)二叉树自己看书,你报名后学校搞培训时也会讲 (8)与 的意思 同真为真 (9)寄存器是CPU内部重要的数据存储资源,是汇编程序员能直接使用的硬件资源之一。 (10)英国 (11)是的 有多种方法,可将10进制化成8进制再加减(我个人比较喜欢都先化成2进制再进行加减,如此也方便转换成其他进制) (12)10进制转化成n进制:若为整数,除n取余,从下往上数;若位小数,乘n取整。 (13)这个……因人而异吧~ 我是TG组的,祝你好运!。(可能表述上有点问题,只因在下语文很差,望见谅) 等你进了复赛就上这2个网去做题:www.vijos.cn或者www.usaco.com。上面都有很多很有用的题,我推荐后者,题目规划更为系统,它的翻译网站是http://www.nocow.cn/index.php/USACO_Training2023-07-09 17:35:445
高中信息学竞赛考什么?
考编程解决问题的能力,语言用pascal或者c 高中阶段参加信息学竞赛并获省一等奖及以上可以加分或保送(这个具体要看各省每年的高考加分政策) 最好是要有足够的分析推理演算能力,这样能够很快地为一个问题设计出一个较好的算法并加以实现,具体题目你可以到www.vijos.cn或类似网站上看看 另外各科成绩也要好点(一个经典的例子是,语文学不好,题目看不懂,100分就这样丢了) PS.我是把它当副业,作为业余爱好的.有没有加分无所谓,信息学竞赛其实比其他学科竞赛有趣多了,而且对以后大学的学习很有用.只要获得省级奖项,学校是会给我们发奖金的^_^ 祝你好运2023-07-09 17:36:063
如何在网站服务器上搭建OJ?
操作系统的选择网站放在Linux或者Windows上其实问题都不大。但是鉴于,如果你的平台今后要拿出去办比赛等活动,那么一个正版的Windows商业授权是需要的。所以为了更加经济,选择Linux平台可能更好一点。但是你的判题核心的部分一定要放到Linux环境下。一个,正式比赛的最终判题环境是Linux;二者,Windows上使用GCC系列的编译器毕竟和Linux下有不少的差距,最终可能会导致很多蛋疼的问题。Web部分这部分没啥好说的,基本上用啥都行,和普通的Web方案没啥区别。Django、ROR、.Net、J2EE、PHP等等,没什么特殊的地方。判题节点判题部分是整个OnlineJudge网站的核心所在。一般建议把判题部分单独抽出来成为一个服务,这样便于随时通过增加判题节点来加快判题的速度。我们目前的思路是,Web端通过发送判题的请求给RabbitMQ等消息队列,每一个判题节点就是一个worker,这样可以非常简单的扩展判题节点的数量。如果网站需要提供代理POJ、ZOJ、HDU等OJ的判题功能的话,可以同样的使用上述的思路,构建代理判题的节点,自由扩展。判题核心判题核心就是实际去编译、运行用户提交上来的代码的程序。可以成为一个sandbox沙盒。由于本人对Windows的API不是很懂,所以是在Linux上写的。安全性问题,可以参看这个回答Online Judge 是如何解决判题端安全性问题的?,基本思路都是这样。通过fork出另外一个进程,通过设置时间、内存等限制,通过ptrace进行监控,对系统调用进行限制,来解决安全性问题。但是现在有一个新的思路,就是对判题核心很简单的运行用户的代码,计算时间、内存的使用量,把所有的安全性问题交给Docker来解决。因为Docker是一个非常轻量级的虚拟化方案,启动一个Docker容器就和启动一个程序一样快速,所以把判题核心的程序放到Docker里,就算用户代码搞破坏,最终挂掉的也就是Docker的容器。只要处理好和Docker的交互就可以了。但是这只是一个设想,还没有最终实现,还处于开发阶段,但是思想应该是可行的。2023-07-09 17:36:151
初学C++求几个适合新手的OJ刷题网站
RQNOJ,VIJOS 这两个还比较基本,题目也是中文的对于准备NOI或者省选的话,BZOJ是不错的ACM什么的,最好就做POJ,SGU,Codeforces等题库,这些都是英文的2023-07-09 17:36:244
背包问题
背包问题 它是在1978年由Merkel和Hellman提出的。它的主要思路是假定某人拥有大量物品,重量各不同。此人通过秘密地选择一部分物品并将它们放到背包中来加密消息。背包中的物品中重量是公开的,所有可能的物品也是公开的,但背包中的物品是保密的。附加一定的限制条件,给出重量,而要列出可能的物品,在计算上是不可实现的。背包问题是熟知的不可计算问题,背包体制以其加密,解密速度快而其人注目。但是,大多数一次背包体制均被破译了,因此现在很少有人使用它。 DD牛的背包九讲 P01: 01背包问题 题目 有N件物品和一个容量为V的背包。第i件物品的费用是c,价值是w。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。 基本思路 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。 用子问题定义状态:即f[v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:f[v]=max{f[v],f[v-c]+w}。 这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的。所以有必要将它详细解释一下:“将前i件物品放入容量为v的背包中”这个子问题,若只考虑第i件物品的策略(放或不放),那么就可以转化为一个只牵扯前i-1件物品的问题。如果不放第i件物品,那么问题就转化为“前i-1件物品放入容量为v的背包中”;如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为v-c的背包中”,此时能获得的最大价值就是f [v-c]再加上通过放入第i件物品获得的价值w。 注意f[v]有意义当且仅当存在一个前i件物品的子集,其费用总和为v。所以按照这个方程递推完毕后,最终的答案并不一定是f[N] [V],而是f[N][0..V]的最大值。如果将状态的定义中的“恰”字去掉,在转移方程中就要再加入一项f[v-1],这样就可以保证f[N] [V]就是最后的答案。至于为什么这样就可以,由你自己来体会了。 优化空间复杂度 以上方法的时间和空间复杂度均为O(N*V),其中时间复杂度基本已经不能再优化了,但空间复杂度却可以优化到O(V)。 先考虑上面讲的基本思路如何实现,肯定是有一个主循环i=1..N,每次算出来二维数组f[0..V]的所有值。那么,如果只用一个数组f [0..V],能不能保证第i次循环结束后f[v]中表示的就是我们定义的状态f[v]呢?f[v]是由f[v]和f [v-c]两个子问题递推而来,能否保证在推f[v]时(也即在第i次主循环中推f[v]时)能够得到f[v]和f[v -c]的值呢?事实上,这要求在每次主循环中我们以v=V..0的顺序推f[v],这样才能保证推f[v]时f[v-c]保存的是状态f[v-c]的值。伪代码如下: for i=1..N for v=V..0 f[v]=max{f[v],f[v-c]+w}; 其中的f[v]=max{f[v],f[v-c]}一句恰就相当于我们的转移方程f[v]=max{f[v],f[v-c]},因为现在的f[v-c]就相当于原来的f[v-c]。如果将v的循环顺序从上面的逆序改成顺序的话,那么则成了f[v]由f[v-c]推知,与本题意不符,但它却是另一个重要的背包问题P02最简捷的解决方案,故学习只用一维数组解01背包问题是十分必要的。 总结 01背包问题是最基本的背包问题,它包含了背包问题中设计状态、方程的最基本思想,另外,别的类型的背包问题往往也可以转换成01背包问题求解。故一定要仔细体会上面基本思路的得出方法,状态转移方程的意义,以及最后怎样优化的空间复杂度。 P02: 完全背包问题 题目 有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是c,价值是w。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。 基本思路 这个问题非常类似于01背包问题,所不同的是每种物品有无限件。也就是从每种物品的角度考虑,与它相关的策略已并非取或不取两种,而是有取0件、取1件、取2件……等很多种。如果仍然按照解01背包时的思路,令f[v]表示前i种物品恰放入一个容量为v的背包的最大权值。仍然可以按照每种物品不同的策略写出状态转移方程,像这样:f[v]=max{f[v-k*c]+k*w|0<=k*c<= v}。这跟01背包问题一样有O(N*V)个状态需要求解,但求解每个状态的时间则不是常数了,求解状态f[v]的时间是O(v/c),总的复杂度是超过O(VN)的。 将01背包问题的基本思路加以改进,得到了这样一个清晰的方法。这说明01背包问题的方程的确是很重要,可以推及其它类型的背包问题。但我们还是试图改进这个复杂度。 一个简单有效的优化 完全背包问题有一个很简单有效的优化,是这样的:若两件物品i、j满足c<=c[j]且w>=w[j],则将物品j去掉,不用考虑。这个优化的正确性显然:任何情况下都可将价值小费用高得j换成物美价廉的i,得到至少不会更差的方案。对于随机生成的数据,这个方法往往会大大减少物品的件数,从而加快速度。然而这个并不能改善最坏情况的复杂度,因为有可能特别设计的数据可以一件物品也去不掉。 转化为01背包问题求解 既然01背包问题是最基本的背包问题,那么我们可以考虑把完全背包问题转化为01背包问题来解。最简单的想法是,考虑到第i种物品最多选V/c 件,于是可以把第i种物品转化为V/c件费用及价值均不变的物品,然后求解这个01背包问题。这样完全没有改进基本思路的时间复杂度,但这毕竟给了我们将完全背包问题转化为01背包问题的思路:将一种物品拆成多件物品。 更高效的转化方法是:把第i种物品拆成费用为c*2^k、价值为w*2^k的若干件物品,其中k满足c*2^k<V。这是二进制的思想,因为不管最优策略选几件第i种物品,总可以表示成若干个2^k件物品的和。这样把每种物品拆成O(log(V/c))件物品,是一个很大的改进。 但我们有更优的O(VN)的算法。 * O(VN)的算法 这个算法使用一维数组,先看伪代码: <pre class"example"> for i=1..N for v=0..V f[v]=max{f[v],f[v-c]+w}; 你会发现,这个伪代码与P01的伪代码只有v的循环次序不同而已。为什么这样一改就可行呢?首先想想为什么P01中要按照v=V..0的逆序来循环。这是因为要保证第i次循环中的状态f[v]是由状态f[v-c]递推而来。换句话说,这正是为了保证每件物品只选一次,保证在考虑“选入第i件物品”这件策略时,依据的是一个绝无已经选入第i件物品的子结果f[v-c]。而现在完全背包的特点恰是每种物品可选无限件,所以在考虑“加选一件第i种物品”这种策略时,却正需要一个可能已选入第i种物品的子结果f[v-c],所以就可以并且必须采用v= 0..V的顺序循环。这就是这个简单的程序为何成立的道理。 这个算法也可以以另外的思路得出。例如,基本思路中的状态转移方程可以等价地变形成这种形式:f[v]=max{f[v],f[v-c]+w},将这个方程用一维数组实现,便得到了上面的伪代码。 总结 完全背包问题也是一个相当基础的背包问题,它有两个状态转移方程,分别在“基本思路”以及“O(VN)的算法“的小节中给出。希望你能够对这两个状态转移方程都仔细地体会,不仅记住,也要弄明白它们是怎么得出来的,最好能够自己想一种得到这些方程的方法。事实上,对每一道动态规划题目都思考其方程的意义以及如何得来,是加深对动态规划的理解、提高动态规划功力的好方法。 P03: 多重背包问题 题目 有N种物品和一个容量为V的背包。第i种物品最多有n件可用,每件费用是c,价值是w。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。 基本算法 这题目和完全背包问题很类似。基本的方程只需将完全背包问题的方程略微一改即可,因为对于第i种物品有n+1种策略:取0件,取1件……取 n件。令f[v]表示前i种物品恰放入一个容量为v的背包的最大权值,则:f[v]=max{f[v-k*c]+ k*w|0<=k<=n}。复杂度是O(V*∑n)。 转化为01背包问题 另一种好想好写的基本方法是转化为01背包求解:把第i种物品换成n件01背包中的物品,则得到了物品数为∑n的01背包问题,直接求解,复杂度仍然是O(V*∑n)。 但是我们期望将它转化为01背包问题之后能够像完全背包一样降低复杂度。仍然考虑二进制的思想,我们考虑把第i种物品换成若干件物品,使得原问题中第i种物品可取的每种策略——取0..n件——均能等价于取若干件代换以后的物品。另外,取超过n件的策略必不能出现。 方法是:将第i种物品分成若干件物品,其中每件物品有一个系数,这件物品的费用和价值均是原来的费用和价值乘以这个系数。使这些系数分别为 1,2,4,...,2^(k-1),n-2^k+1,且k是满足n-2^k+1>0的最大整数。例如,如果n为13,就将这种物品分成系数分别为1,2,4,6的四件物品。 分成的这几件物品的系数和为n,表明不可能取多于n件的第i种物品。另外这种方法也能保证对于0..n间的每一个整数,均可以用若干个系数的和表示,这个证明可以分0..2^k-1和2^k..n两段来分别讨论得出,并不难,希望你自己思考尝试一下。 这样就将第i种物品分成了O(log n)种物品,将原问题转化为了复杂度为O(V*∑log n)的01背包问题,是很大的改进。 O(VN)的算法 多重背包问题同样有O(VN)的算法。这个算法基于基本算法的状态转移方程,但应用单调队列的方法使每个状态的值可以以均摊O(1)的时间求解。由于用单调队列优化的DP已超出了NOIP的范围,故本文不再展开讲解。我最初了解到这个方法是在楼天成的“男人八题”幻灯片上。 小结 这里我们看到了将一个算法的复杂度由O(V*∑n)改进到O(V*∑log n)的过程,还知道了存在应用超出NOIP范围的知识的O(VN)算法。希望你特别注意“拆分物品”的思想和方法,自己证明一下它的正确性,并用尽量简洁的程序来实现。 P04: 混合三种背包问题 问题 如果将P01、P02、P03混合起来。也就是说,有的物品只可以取一次(01背包),有的物品可以取无限次(完全背包),有的物品可以取的次数有一个上限(多重背包)。应该怎么求解呢? 01背包与完全背包的混合 考虑到在P01和P02中最后给出的伪代码只有一处不同,故如果只有两类物品:一类物品只能取一次,另一类物品可以取无限次,那么只需在对每个物品应用转移方程时,根据物品的类别选用顺序或逆序的循环即可,复杂度是O(VN)。伪代码如下: for i=1..N if 第i件物品是01背包 for v=V..0 f[v]=max{f[v],f[v-c]+w}; else if 第i件物品是完全背包 for v=0..V f[v]=max{f[v],f[v-c]+w}; 再加上多重背包 如果再加上有的物品最多可以取有限次,那么原则上也可以给出O(VN)的解法:遇到多重背包类型的物品用单调队列解即可。但如果不考虑超过NOIP范围的算法的话,用P03中将每个这类物品分成O(log n)个01背包的物品的方法也已经很优了。 小结 有人说,困难的题目都是由简单的题目叠加而来的。这句话是否公理暂且存之不论,但它在本讲中已经得到了充分的体现。本来01背包、完全背包、多重背包都不是什么难题,但将它们简单地组合起来以后就得到了这样一道一定能吓倒不少人的题目。但只要基础扎实,领会三种基本背包问题的思想,就可以做到把困难的题目拆分成简单的题目来解决。 P05: 二维费用的背包问题 问题 二维费用的背包问题是指:对于每件物品,具有两种不同的费用;选择这件物品必须同时付出这两种代价;对于每种代价都有一个可付出的最大值(背包容量)。问怎样选择物品可以得到最大的价值。设这两种代价分别为代价1和代价2,第i件物品所需的两种代价分别为a和b。两种代价可付出的最大值(两种背包容量)分别为V和U。物品的价值为w。 算法 费用加了一维,只需状态也加一维即可。设f[v]表示前i件物品付出两种代价分别为v和u时可获得的最大价值。状态转移方程就是:f [v]=max{f[v],f[v-a]]+w}。如前述方法,可以只使用二维的数组:当每件物品只可以取一次时变量v和u采用顺序的循环,当物品有如完全背包问题时采用逆序的循环。当物品有如多重背包问题时拆分物品。 物品总个数的限制 有时,“二维费用”的条件是以这样一种隐含的方式给出的:最多只能取M件物品。这事实上相当于每件物品多了一种“件数”的费用,每个物品的件数费用均为1,可以付出的最大件数费用为M。换句话说,设f[v][m]表示付出费用v、最多选m件时可得到的最大价值,则根据物品的类型(01、完全、多重)用不同的方法循环更新,最后在f[0..V][0..M]范围内寻找答案。 另外,如果要求“恰取M件物品”,则在f[0..V][M]范围内寻找答案。 小结 事实上,当发现由熟悉的动态规划题目变形得来的题目时,在原来的状态中加一纬以满足新的限制是一种比较通用的方法。希望你能从本讲中初步体会到这种方法。 P06: 分组的背包问题 问题 有N件物品和一个容量为V的背包。第i件物品的费用是c,价值是w。这些物品被划分为若干组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。 算法 这个问题变成了每组物品有若干种策略:是选择本组的某一件,还是一件都不选。也就是说设f[k][v]表示前k组物品花费费用v能取得的最大权值,则有f[k][v]=max{f[k-1][v],f[k-1][v-c]+w|物品i属于第k组}。 使用一维数组的伪代码如下: for 所有的组k for 所有的i属于组k for v=V..0 f[v]=max{f[v],f[v-c]+w} 另外,显然可以对每组中的物品应用P02中“一个简单有效的优化”。 小结 分组的背包问题将彼此互斥的若干物品称为一个组,这建立了一个很好的模型。不少背包问题的变形都可以转化为分组的背包问题(例如P07),由分组的背包问题进一步可定义“泛化物品”的概念,十分有利于解题。 P07: 有依赖的背包问题 简化的问题 这种背包问题的物品间存在某种“依赖”的关系。也就是说,i依赖于j,表示若选物品i,则必须选物品j。为了简化起见,我们先设没有某个物品既依赖于别的物品,又被别的物品所依赖;另外,没有某件物品同时依赖多件物品。 算法 这个问题由NOIP2006金明的预算方案一题扩展而来。遵从该题的提法,将不依赖于别的物品的物品称为“主件”,依赖于某主件的物品称为“附件”。由这个问题的简化条件可知所有的物品由若干主件和依赖于每个主件的一个附件集合组成。 按照背包问题的一般思路,仅考虑一个主件和它的附件集合。可是,可用的策略非常多,包括:一个也不选,仅选择主件,选择主件后再选择一个附件,选择主件后再选择两个附件……无法用状态转移方程来表示如此多的策略。(事实上,设有n个附件,则策略有2^n+1个,为指数级。) 考虑到所有这些策略都是互斥的(也就是说,你只能选择一种策略),所以一个主件和它的附件集合实际上对应于P06中的一个物品组,每个选择了主件又选择了若干个附件的策略对应于这个物品组中的一个物品,其费用和价值都是这个策略中的物品的值的和。但仅仅是这一步转化并不能给出一个好的算法,因为物品组中的物品还是像原问题的策略一样多。 再考虑P06中的一句话: 可以对每组中的物品应用P02中“一个简单有效的优化”。这提示我们,对于一个物品组中的物品,所有费用相同的物品只留一个价值最大的,不影响结果。所以,我们可以对主件i的“附件集合”先进行一次01背包,得到费用依次为0..V-c所有这些值时相应的最大价值f"[0..V-c]。那么这个主件及它的附件集合相当于V-c+1个物品的物品组,其中费用为c+k的物品的价值为f"[k]+w。也就是说原来指数级的策略中有很多策略都是冗余的,通过一次01背包后,将主件i转化为 V-c+1个物品的物品组,就可以直接应用P06的算法解决问题了。 更一般的问题 更一般的问题是:依赖关系以图论中“森林”的形式给出(森林即多叉树的集合),也就是说,主件的附件仍然可以具有自己的附件集合,限制只是每个物品最多只依赖于一个物品(只有一个主件)且不出现循环依赖。 解决这个问题仍然可以用将每个主件及其附件集合转化为物品组的方式。唯一不同的是,由于附件可能还有附件,就不能将每个附件都看作一个一般的01 背包中的物品了。若这个附件也有附件集合,则它必定要被先转化为物品组,然后用分组的背包问题解出主件及其附件集合所对应的附件组中各个费用的附件所对应的价值。 事实上,这是一种树形DP,其特点是每个父节点都需要对它的各个儿子的属性进行一次DP以求得自己的相关属性。这已经触及到了“泛化物品”的思想。看完P08后,你会发现这个“依赖关系树”每一个子树都等价于一件泛化物品,求某节点为根的子树对应的泛化物品相当于求其所有儿子的对应的泛化物品之和。 P08: 泛化物品 定义 考虑这样一种物品,它并没有固定的费用和价值,而是它的价值随着你分配给它的费用而变化。这就是泛化物品的概念。 更严格的定义之。在背包容量为V的背包问题中,泛化物品是一个定义域为0..V中的整数的函数h,当分配给它的费用为v时,能得到的价值就是h(v)。 这个定义有一点点抽象,另一种理解是一个泛化物品就是一个数组h[0..V],给它费用v,可得到价值h[V]。 一个费用为c价值为w的物品,如果它是01背包中的物品,那么把它看成泛化物品,它就是除了h(c)=w其它函数值都为0的一个函数。如果它是完全背包中的物品,那么它可以看成这样一个函数,仅当v被c整除时有h(v)=v/c*w,其它函数值均为0。如果它是多重背包中重复次数最多为n的物品,那么它对应的泛化物品的函数有h(v)=v/c*w仅当v被c整除且v/c<=n,其它情况函数值均为0。 一个物品组可以看作一个泛化物品h。对于一个0..V中的v,若物品组中不存在费用为v的的物品,则h(v)=0,否则h(v)为所有费用为v的物品的最大价值。P07中每个主件及其附件集合等价于一个物品组,自然也可看作一个泛化物品。 泛化物品的和 如果面对两个泛化物品h和l,要用给定的费用从这两个泛化物品中得到最大的价值,怎么求呢?事实上,对于一个给定的费用v,只需枚举将这个费用如何分配给两个泛化物品就可以了。同样的,对于0..V的每一个整数v,可以求得费用v分配到h和l中的最大价值f(v)。也即f(v)=max{h(k) +l(v-k)|0<=k<=v}。可以看到,f也是一个由泛化物品h和l决定的定义域为0..V的函数,也就是说,f是一个由泛化物品h和 l决定的泛化物品。 由此可以定义泛化物品的和:h、l都是泛化物品,若泛化物品f满足f(v)=max{h(k)+l(v-k)|0<=k<=v},则称f是h与l的和,即f=h+l。这个运算的时间复杂度是O(V^2)。 泛化物品的定义表明:在一个背包问题中,若将两个泛化物品代以它们的和,不影响问题的答案。事实上,对于其中的物品都是泛化物品的背包问题,求它的答案的过程也就是求所有这些泛化物品之和的过程。设此和为s,则答案就是s[0..V]中的最大值。 背包问题的泛化物品 一个背包问题中,可能会给出很多条件,包括每种物品的费用、价值等属性,物品之间的分组、依赖等关系等。但肯定能将问题对应于某个泛化物品。也就是说,给定了所有条件以后,就可以对每个非负整数v求得:若背包容量为v,将物品装入背包可得到的最大价值是多少,这可以认为是定义在非负整数集上的一件泛化物品。这个泛化物品——或者说问题所对应的一个定义域为非负整数的函数——包含了关于问题本身的高度浓缩的信息。一般而言,求得这个泛化物品的一个子域(例如0..V)的值之后,就可以根据这个函数的取值得到背包问题的最终答案。 综上所述,一般而言,求解背包问题,即求解这个问题所对应的一个函数,即该问题的泛化物品。而求解某个泛化物品的一种方法就是将它表示为若干泛化物品的和然后求之。 小结 本讲可以说都是我自己的原创思想。具体来说,是我在学习函数式编程的 Scheme 语言时,用函数编程的眼光审视各类背包问题得出的理论。这一讲真的很抽象,也许在“模型的抽象程度”这一方面已经超出了NOIP的要求,所以暂且看不懂也没关系。相信随着你的OI之路逐渐延伸,有一天你会理解的。 我想说:“思考”是一个OIer最重要的品质。简单的问题,深入思考以后,也能发现更多。 P09: 背包问题问法的变化 以上涉及的各种背包问题都是要求在背包容量(费用)的限制下求可以取到的最大价值,但背包问题还有很多种灵活的问法,在这里值得提一下。但是我认为,只要深入理解了求背包问题最大价值的方法,即使问法变化了,也是不难想出算法的。 例如,求解最多可以放多少件物品或者最多可以装满多少背包的空间。这都可以根据具体问题利用前面的方程求出所有状态的值(f数组)之后得到。 还有,如果要求的是“总价值最小”“总件数最小”,只需简单的将上面的状态转移方程中的max改成min即可。 下面说一些变化更大的问法。 输出方案 一般而言,背包问题是要求一个最优值,如果要求输出这个最优值的方案,可以参照一般动态规划问题输出方案的方法:记录下每个状态的最优值是由状态转移方程的哪一项推出来的,换句话说,记录下它是由哪一个策略推出来的。便可根据这条策略找到上一个状态,从上一个状态接着向前推即可。 还是以01背包为例,方程为f[v]=max{f[v],f[v-c]+w}。再用一个数组g [v],设g[v]=0表示推出f[v]的值时是采用了方程的前一项(也即f[v]=f[v]),g[v]表示采用了方程的后一项。注意这两项分别表示了两种策略:未选第i个物品及选了第i个物品。那么输出方案的伪代码可以这样写(设最终状态为f[N][V]): i=N v=V while(i>0) if(g[v]==0) print "未选第i项物品" else if(g[v]==1) print "选了第i项物品" v=v-c 另外,采用方程的前一项或后一项也可以在输出方案的过程中根据f[v]的值实时地求出来,也即不须纪录g数组,将上述代码中的g [v]==0改成f[v]==f[v],g[v]==1改成f[v]==f[v-c]+w也可。 输出字典序最小的最优方案 这里“字典序最小”的意思是1..N号物品的选择方案排列出来以后字典序最小。以输出01背包最小字典序的方案为例。 一般而言,求一个字典序最小的最优方案,只需要在转移时注意策略。首先,子问题的定义要略改一些。我们注意到,如果存在一个选了物品1的最优方案,那么答案一定包含物品1,原问题转化为一个背包容量为v-c[1],物品为2..N的子问题。反之,如果答案不包含物品1,则转化成背包容量仍为V,物品为2..N的子问题。不管答案怎样,子问题的物品都是以i..N而非前所述的1..i的形式来定义的,所以状态的定义和转移方程都需要改一下。但也许更简易的方法是先把物品逆序排列一下,以下按物品已被逆序排列来叙述。 在这种情况下,可以按照前面经典的状态转移方程来求值,只是输出方案的时候要注意:从N到1输入时,如果f[v]==f及f[v]==f[f-c]+w同时成立,应该按照后者(即选择了物品i)来输出方案。 求方案总数 对于一个给定了背包容量、物品费用、物品间相互关系(分组、依赖等)的背包问题,除了再给定每个物品的价值后求可得到的最大价值外,还可以得到装满背包或将背包装至某一指定容量的方案总数。 对于这类改变问法的问题,一般只需将状态转移方程中的max改成sum即可。例如若每件物品均是01背包中的物品,转移方程即为f[v]=sum{f[v],f[v-c]+w},初始条件f[0][0]=1。 事实上,这样做可行的原因在于状态转移方程已经考察了所有可能的背包组成方案。 最优方案的总数 这里的最优方案是指物品总价值最大的方案。还是以01背包为例。 结合求最大总价值和方案总数两个问题的思路,最优方案的总数可以这样求:f[v]意义同前述,g[v]表示这个子问题的最优方案的总数,则在求f[v]的同时求g[v]的伪代码如下: for i=1..N for v=0..V f[v]=max{f[v],f[v-c]+w} g[v]=0 if(f[v]==f[v]) inc(g[v],g[v] if(f[v]==f[v-c]+w) inc(g[v],g[v-c]) 如果你是第一次看到这样的问题,请仔细体会上面的伪代码。 小结 显然,这里不可能穷尽背包类动态规划问题所有的问法。甚至还存在一类将背包类动态规划问题与其它领域(例如数论、图论)结合起来的问题,在这篇论背包问题的专文中也不会论及。但只要深刻领会前述所有类别的背包问题的思路和状态转移方程,遇到其它的变形问法,只要题目难度还属于NOIP,应该也不难想出算法。 触类旁通、举一反三,应该也是一个OIer应有的品质吧。2023-07-09 17:36:342
都说同济的ACM是国内唯一的中文ACM,我怎么就只找到E文的?
英文的不但可以提高算法,还可以提高你的英语水平,这样很好啊国内外知名在线做题网站大集合,建议你去看看哦.http://www.608088.com/show-18-1.html俄罗斯乌拉尔大学在线题库西班牙的Universidad de Valladolid在线题美国著名在线题库浙大北大等等. 如果你是acm新手,可以看看学习acm书籍推荐http://www.608088.com/show-44-1.html2023-07-09 17:36:427
pascal语言题:哪错了啊?
感觉你的代码有点乱这是本人的程序,flyod+高精,虽然比较丑陋,但ac是没问题的var a,s,p:array[0..30]of integer;f:array[0..9,0..9]of boolean;i,j,k,n,x,y,t:integer; ch:char;beginfillchar(a,sizeof(a),0);fillchar(f,sizeof(f),false);fillchar(s,sizeof(s),0);fillchar(p,sizeof(p),0);s[1]:=1;i:=1;repeatread(ch);if ch<>" " then a[i]:=ord(ch)-ord("0");inc(i);until ch=" ";n:=i-2; read(k);for i:=1to k dobeginreadln(x,y);f[x,y]:=true;end;for k:=0to 9 do for i:=0to 9 do for j:=0to 9 do f[i,j]:=f[i,j]or (f[i,k]and f[k,j]);for i:=0to 9 do f[i,i]:=true;for i:=1to n do for j:=0to 9 do if f[a[i],j] then inc(p[i]);for j:=1to n do begin t:=0; for i:=1to 30 do begin s[i]:=s[i]*p[j]+t; t:=s[i] div 10; s[i]:=s[i]mod 10; end; end;i:=30;while s[i]=0 do dec(i);for j:=i downto 1 do write(s[j]);end.2023-07-09 17:36:552
Pascal在线做题网站
http://218.4.165.132/oj/这个也不错。除了PASCAL还有别的,直接上传程序就可以了,还有排名、答案,很方便。2023-07-09 17:37:023
我要自学NOI,怎么开始?
全国青少年信息学奥林匹克联赛教程 南京大学出版社,是一个系列的。从语言开始学还有一套书叫奥赛经典,也很不错自学可能有一些累,我觉得需要老师来教如果你只是参加noip,那么这些书够了,大学的书太讲究理论,看了会走火入魔的,但是如果你想进一步参加全国比赛,这些书必看建议语言学好,pascal比较好上手,c++比较复杂。而且中学生的竞赛书都是pascal,但是大学书都是c的,你要想好你学哪个。我建议,pascal~如果你英语好,可以看看usaco training,一步一步教你怎么做大牛的。如果不是很好的话,可以看看www.vijos.cn测试平台,但是没有usaco好,题目分度不好。或者你喜欢大学的题库,可以看看www.pku.edu.cn,但是比较难。。。然后还有一个网站很好www.oibh.org/bbs,都是参加noip或者noi的高手,可以进去讨论讨论比赛是10月初赛11月复赛,建议暑假看掉书,然后开学后开始狂练真题!真题到处都有!noip就这样了。。。noi的话,一定要跟学长或者老师学啊。。。2023-07-09 17:37:112
我想参加信息学奥赛,关于难度?
我在浙江省,既然你在山东那就建议你放弃,最小费用流……太难了,最大流,在浙江连二等都拿不到PS,c++2,树状数组有几点提一下。楼上提供的几个题库都不错(除了vijos):1,我正在学习红黑树,但没有保送4,做网站有出路.考的是pascal,如果你在宁夏学习拿一等奖还有戏,离散化.你是山东人吗?山东的信息学实力还是比较强的.只有高二学生才具有进省队的资格3,c.只有省一等才有进省队的资格,我是做timusonlinejudge的,话说会做前三题,线段树2023-07-09 17:37:216
vijos如何偷数据????
...............var n,i,m:longint;beginfor i:=1 to m do read(n);{m视情况而定,比如你想要第1个数,m=1,依此类推}writeln(n);end.具体情况要看输入数据而定....至于时间嘛....慢慢偷吧,记得不要把晚饭时间错过了.....ORZ。。。。2023-07-09 17:37:461
怎么做一个judge online平台啊谢谢了,大神帮忙啊
Online Judge简称OJ,意思是在线评测平台,多指信息学在线评测平台。 知名的OJ有:URAL,SPOJ,vijos,USACO,sgu,pku(poj),zju(toj),tju,uva等。 著名OJ网址: 北京大学pku: http://acm.pku.edu.cn/OnlineJudge/ (most English) 美国官方USACO: http://ace.delos.com/usacogate/ (America, English) 高效信息学评测系统vijos: http://www.vijos.cn (维护中) 南开大学nkpc: http://acm.nankai.edu.cn (most English) 首先是国内比较老牌的知名OJ: PKU/POJ(Peking University Judge Online For ACM/ICpc) 地址: http://acm.pku.cn/JudgeOnline 介绍: 北京大学的题库,我主要在做的一个.题目数量很多,OJ的各项功能也很完善,而且还提供免费的OJ系统下载,可以利用提供的系统自己搭建OJ.题目数量很多,有几千道,但水题也很多.关于这一点,因为题目数量大,所以水题自然就多,但这不说明PKU的题目质量不高.PKU的难题还是不少的,而且做不做水题还是要由做题人自己决定的,和OJ无关. 推荐程度(最高10): 8 推荐做法: 如果是初学者或者仅仅想提高变成准确性,那么按照AC率做,保证1Y率;如果是有一定水平的OIer,可以每页完成40~50题;如果是大牛,那么尽量做吧;如果想专门训练某个项目,可以去网上搜pku题目分类,个人觉得pku里的dp题和数学题比较多. ZJU/ZOJ(Zhejiang University Online Judge) 地址: http://acm.zju.edu.cn/ 介绍: 浙江大学的题库,国内起步最早的几个OJ之一.题目数量也接近2000.我没有太多的做zju的题目,所以不好说题目质量如何.OJ系统的友好性不如pku,但功能并不差.应该可以作为pku的替代品. 推荐程度: 7 推荐做法: 无(可以参考pku做法) 然后是一些不太知名的或比较新的: Vijos(Velocious Informatics Judge Online System) 地址: http://www.vijos.cn/ 介绍: 说到现在的OJ,就不得不提Vijos.Vijos是Vivian Snow(就是湖南师大附中的刘康,个人主页是 http://www.viviansnow.cn/, 现在似乎上不去了=.=)搞的一个Judge系统,本来是作为创新大赛作品的,后来就搞起来了,现在人气很旺.但是Vijos的各种事情很多,而且服务器不稳定,速度慢不说还时不时的关闭.关于Vijos的事情大家可以参考Dragon.Dai在Vijos的1周岁时候写下的这篇<Vijos的过去,现在和将来>( http://www.mybloop.com/get/376674/Vijos.doc ),这里不再赘述.Vijos上所有人都可以上传自己的题目,虽然增加了很多灵活性,但由此导致的是题目水平参差不齐.而且上传题目的人在选择题目难度的时候很难做出同样的判断,都有自己的个人见解,所以本来题目难度是很好的一个设计,现在却成了鸡肋. 推荐程度: 5 推荐做法: 用来测试竞赛原题,另外可以做一做AC率较低的题目.不推荐做大量的Vijos题目(yours牛别打我...). TJU/TOJ(Tianjin University Online Judge) 地址: http://acm.tju.edu.cn/toj 介绍: 可能大家都以为是同济的题库了吧=.=,其实这个是天津大学的,因为笔者是天津人,所以对这个OJ有独特的感情...虽然没怎么做过.总体来说比zoj稍差,题目质量不确定(我说了我没怎么做过...),一般我都用来做Contests. 推荐程度: 5 推荐做法: 无,可以做做Contests.注意是Online Contests而不是Virtual Contests,Virtual那个...打开就能知道,是利用TOJ自己的题库出Contests...其实这个设计很新颖,所有人都可以出测试.适合队内搞测验... NKOJ(Nankai Online Judge) 地址: http://acm.nankai.edu.cn/ 介绍: 这个是天津市南开大学的OJ,想必大多数人都不知道吧?在看下面的介绍之前,你可以先上去看看,体会一下.你一定会发现,通过大量Ajax技术的应用,加上清新的界面,你会感到十分舒适.而且nkoj似乎有一个功能是自己不出现在Rank List和Status里面,这个功能很贴心.题目是nkoj最大的弱点,数量不大,质量一般.不过因为是中英文题目夹杂且中文题目数量不少(和pku比),所以想做中文题的除了Vijos也可以来这里看看.其实nkoj比vijos要漂亮的多,速度比vijos稍快,稳定性...应该比vijos好不少吧. 推荐程度: 5 推荐做法: 做中文题. rqnoj(RenQingNet Online Judge,任青网络信息学奥赛(OI)在线判题系统) 地址: http://www.rqnoj.cn/ 介绍: 一个新兴的OJ,题目质量一般,数量也不多.除了去刷Rank,没有什么值得做的. 推荐程度: 2 推荐做法: 无. 接下来说一下国外的OJ: SGU(Saratov State University Online Contester) 地址: http://acm.sgu.ru/ 介绍: sgu是俄罗斯斯坦福州立大学(大概是这个名字)的OJ,很老牌了.题目数量很少,但题题精炼,每做一道题都会让你的编程水平上升.在有一定编程水平之后可以试着做做,要争取做出每一道题.如果sgu能全部AC的话...那这个人不是抄袭就是神牛...注意status需要通过左边的"status online"链接来看,而且sgu速度稍慢并且不太稳定.总之是非常特别以及及其应该推荐的OJ. 推荐程度: 9 推荐做法: AC每一道题,可以按照AC Rate来做. Ural(Timus Online Judge) 地址: http://acm.timus.ru/ 介绍: Ural是Ural State University的一个OJ,题目不是很多,但都是原创,而且比较经典.如果sgu做着费劲,那么试试Ural吧. 推荐程度: 8 推荐做法: 试着做做每一道题吧,可以按照AC Rate来. 追问: 怎么全是讲做题啊??? 麻烦您讲下具体步骤啊........ 是做平台啊,不是做题啊2023-07-09 17:37:542
求像北大百练POJ那样的提供程序设计题目的网站的网址,最好是中文的
Online Judge简称OJ,意思是在线评测平台,多指信息学在线评测平台。 知名的OJ有:RQNOJ,URAL,SPOJ,vijos,USACO,sgu,pku(poj),zju(toj),tju,uva等。 著名OJ网址: 中文OJ: 任青网络在线测评系统RQNOJ:http://www.rqnoj.cn/ 高效信息学评测系统vijos: http://www.vijos.cn (2008.7.12复活) 英文OJ: 北京大学pku: http://acm.pku.edu.cn/OnlineJudge/ (most English) 美国官方USACO: http://ace.delos.com/usacogate/ (America, English) 南开大学nkpc: http://acm.nankai.edu.cn (most English) 浙江大学OJ:http://acm.zju.edu.cn/ (英语) 首先是国内比较老牌的知名OJ: PKU/POJ(Peking University Judge Online For ACM/ICPC) 地址: http://acm.pku.cn/JudgeOnline 介绍: 北京大学的题库,我主要在做的一个.题目数量很多,OJ的各项功能也很完善,而且还提供免费的OJ系统下载,可以利用提供的系统自己搭建OJ.题目数量很多,有几千道,但水题也很多.关于这一点,因为题目数量大,所以水题自然就多,但这不说明PKU的题目质量不高.PKU的难题还是不少的,而且做不做水题还是要由做题人自己决定的,和OJ无关. 推荐程度(最高10): 8 推荐做法: 如果是初学者或者仅仅想提高变成准确性,那么按照AC率做,保证1Y率;如果是有一定水平的OIer,可以每页完成40~50题;如果是大牛,那么尽量做吧;如果想专门训练某个项目,可以去网上搜pku题目分类,个人觉得pku里的dp题和数学题比较多. ZJU/ZOJ(Zhejiang University Online Judge) 地址: http://acm.zju.edu.cn/ 介绍: 浙江大学的题库,国内起步最早的几个OJ之一.题目数量也接近2000.我没有太多的做zju的题目,所以不好说题目质量如何.OJ系统的友好性不如pku,但功能并不差.应该可以作为pku的替代品. 推荐程度: 7 推荐做法: 无(可以参考pku做法) HOJ 地址: http://acm.hit.edu.cn/ (网通代理http://acm-hit.sunner.cn) 介绍: 哈尔滨工业大学OJ,相对来说起步不早也不晚,曾经也涌现了许多大牛。现在题目数量接近3000,难度参差不起,由于学校开始重视其ACM,最近活动频繁。不过友好性较差,系统构建不是很完善,但功能不差。 推荐程度: 6 推荐做法: 无 然后是一些不太知名的或比较新的: RQNOJ(RenQingNet Online Judge,任青网络信息学奥赛(OI)在线判题系统) 地址: http://www.rqnoj.cn/ 介绍: RQNOJ经过了一年的时间逐渐的成熟起来,题目的数量也不断的增加,使用的用户数量也上升了不少,对于最近RQNOJ推出的一些新功能,很值得称赞。还有经常有一些比赛,可以去参加。 推荐程度: 7 推荐做法: 做一些有难度的题目 Vijos(Velocious Informatics Judge Online System) 地址: http://www.vijos.cn/ 介绍: 说到现在的OJ,就不得不提Vijos.Vijos是Vivian Snow(就是湖南师大附中的刘康,个人主页是http://www.viviansnow.cn/,现在似乎上不去了=.=)搞的一个Judge系统,本来是作为创新大赛作品的,后来就搞起来了,现在人气很旺.但是Vijos的各种事情很多,而且服务器不稳定,速度慢不说还时不时的关闭.关于Vijos的事情大家可以参考Dragon.Dai在Vijos的1周岁时候写下的这篇<Vijos的过去,现在和将来>(http://www.mybloop.com/get/376674/Vijos.doc),这里不再赘述.Vijos上所有人都可以上传自己的题目,虽然增加了很多灵活性,但由此导致的是题目水平参差不齐.而且上传题目的人在选择题目难度的时候很难做出同样的判断,都有自己的个人见解,所以本来题目难度是很好的一个设计,现在却成了鸡肋。从2007年末曾关闭维护了一段时间,现在已于2008.7.12复活。 推荐程度: 5 推荐做法: 用来测试竞赛原题,另外可以做一做AC率较低的题目.不推荐做大量的Vijos题目(yours牛别打我...). TJU/TOJ(Tianjin University Online Judge) 地址: http://acm.tju.edu.cn/toj 介绍: 可能大家都以为是同济的题库了吧=.=,其实这个是天津大学的,因为笔者是天津人,所以对这个OJ有独特的感情...虽然没怎么做过.总体来说比zoj稍差,题目质量不确定(我说了我没怎么做过...),一般我都用来做Contests. 推荐程度: 5 推荐做法: 无,可以做做Contests.注意是Online Contests而不是Virtual Contests,Virtual那个...打开就能知道,是利用TOJ自己的题库出Contests...其实这个设计很新颖,所有人都可以出测试.适合队内搞测验... NKOJ(Nankai Online Judge) 地址: http://acm.nankai.edu.cn/ 介绍: 这个是天津市南开大学的OJ,想必大多数人都不知道吧?在看下面的介绍之前,你可以先上去看看,体会一下.你一定会发现,通过大量Ajax技术的应用,加上清新的界面,你会感到十分舒适.而且nkoj似乎有一个功能是自己不出现在Rank List和Status里面,这个功能很贴心.题目是nkoj最大的弱点,数量不大,质量一般.不过因为是中英文题目夹杂且中文题目数量不少(和pku比),所以想做中文题的除了Vijos也可以来这里看看.其实nkoj比vijos要漂亮的多,速度比vijos稍快,稳定性...应该比vijos好不少吧. 推荐程度: 5 推荐做法: 做中文题. 接下来说一下国外的OJ: SGU(Saratov State University Online Contester) 地址: http://acm.sgu.ru/ 介绍: sgu是俄罗斯斯坦福州立大学(大概是这个名字)的OJ,很老牌了.题目数量很少,但题题精炼,每做一道题都会让你的编程水平上升.在有一定编程水平之后可以试着做做,要争取做出每一道题.如果sgu能全部AC的话...那这个人不是抄袭就是神牛...注意status需要通过左边的"status online"链接来看,而且sgu速度稍慢并且不太稳定.总之是非常特别以及及其应该推荐的OJ. 推荐程度: 9 推荐做法: AC每一道题,可以按照AC Rate来做. Ural(Timus Online Judge) 地址: http://acm.timus.ru/ 介绍: Ural是Ural State University的一个OJ,题目不是很多,但都是原创,而且比较经典.如果sgu做着费劲,那么试试Ural吧. 推荐程度: 8 推荐做法: 试着做做每一道题吧,可以按照AC Rate来.楼主如果要中文题,又要有难度的话建议去USACO,http://ace.delos.com/usacogate?a=ywd3y6w9Cbo&C=2 网上可以找到译题http://www.oiers.cn/usaco%20training/2023-07-09 17:38:012
那个noip在线题库叫什么TYIJ?
全名是:Tyvj _信息学在线评测系统网址是: http://www.tyvj.cn/最重要的一点是回答题目时,最好先回答第一题,那里面有提交源代码的注意事项。 下面是介绍,嫌麻烦就不要看了。来自 http://baike.baidu.com/view/3100833.htm?fr=ala0_1TYVJ 一个OJ(TYVJ在线测评系统) TYVJ成立于2009年10月20日,是一个面向所有信息学竞赛(NOIP,NOI,CTSC,WC,IOI)、 tyvj 4.20截图 国际大学生程序设计竞赛(ACM)以及编程爱好者准备的一个在线信息学网络平台。 最初的TYVJ是在^逸水之寒^サ(太原成成中学张浩千)的提议下,真空(陈鹏)提供服务器帮助,利用早年Vijos发布在网上的源码做成的一个仅供太原成成中学内部使用的题库。随着NOIP2009的过去,老牌的VIJOS无法稳定使用,TYVJ于2009年11月19日开始全面对外开放。当前TYVJ正在逐步摆脱VIJOS系统局限性,目前此计划已经取得很好的成效。在2010年2月25日,TYVJ正式更换了VIJOS系统传统的系统内核(VTS)而改为了由iceboy提供的全新VijosNT。全新的VijosNT采用云计算的技术,支持多对多的测评方式,将会比过去的内核更加安全。目前Burning Team人员正在计划制作属于TYvj自己的网页端,TYvj将会尽快脱离Vijos的所有系统。但是在这里还是感谢vijos的前期提供系统。 随着Tyvj的发展,目前已经有了有主站、begin初级题库(面向学习语言的朋友)、down数据下载站(下载测评数据)、solve题解站(解题报告发布)等站点,现在正在准备begin2题库,面向Noip普及组成员。同时在2010年7月15日正式对公众开放原题站(yuanti)提供各类竞赛原题以满足广大oier的做题需求。 Tyvj是一个完全公益的网站,不会收取大家任何费用,同时欢迎大家赞助。 其他详情请进入Tyvj网站查看!2023-07-09 17:38:151
请介绍几个您知道的信息学竞赛的网址.
收到了点东西,分享下,嘿嘿国内 ACM Online Judge 列表 浙江大学 http://acm.zju.edu.cn 北京大学 http://acm.pku.edu.cn/JudgeOnline 天津大学 http://acm.tju.edu.cn 吉林大学 http://acm.jlu.edu.cn 厦门大学 http://acm.xmu.edu.cn/JudgeOnline 福州大学 http://acm.fzu.edu.cn 华中科技 http://acm.hust.edu.cn/JudgeOnline 宁波理工 http://acm.nit.net.cn 中科大 http://acm.ustc.edu.cn/ 合肥工大 http://acm.tdzl.net:83/JudgeOnline 汕头大学 http://acm.stu.edu.cn 北大内部 http://ai.pku.cn/JudgeOnline 中国科大 http://acm.ustc.edu.cn 暨南大学 http://202.116.24.78/JudgeOnline 浙江工业 http://acm.zjut.edu.cn 中山大学 http://202.116.77.69/sicily 福建师范 http://acm.fjnu.edu.cn 哈工业大 http://acm.hit.edu.cn/ojs/ojs.php 杭电科大 http://acm.hziee.edu.cn 四川大学 http://acm.scu.edu.cn/soj 哈工程大 http://acm.hrbeu.edu.cn 武汉大学 http://acm.whu.edu.cn/noah 同济大学 http://acm.tongji.edu.cn 湖南大学 http://acm.hnu.cn:8080/online/ 上海大学 http://pc.shu.edu.cn/openjudge/problemlist.php 兰州大学 http://acm.sundayclub.cn/JudgeOnline/problemlist 浙江师范 http://acm.zjnu.cn/ 南航 http://acm.nuaa.edu.cn/ 浙江工大 http://acm.zjut.edu.cn/ VIJOS http://www.vijos.cn/ ; 南京大学 http://cot.nju.edu.cn/ 华东师范 http://acm.cs.ecnu.edu.cn 西南科大 http://222.196.33.254/JudgeOnline/ 北京邮电 http://acm.cs.bupt.cn/onlinejudge/ 中国地质大学 http://lab.cug.edu.cn/COJ/ 国外 ACM Online Judge 列表西班牙Valladolid大学 http://online-judge.uva.es/problemset/ 瓦拉杜利德大学(UVA):http://acm.uva.es/ 俄罗斯Ural立大学 http://acm.timus.ru/ UsacoGate http://ace.delos.com/usacogate Saratov State University http://acm.sgu.ru/ EL Judge(MIPT): http://acm.mipt.ru/judge/problems.pl SPOJ: http://www.spoj.pl/ KRSU: http://www.olymp.krsu.edu.kg/GeneralProblemset.aspx USACO http://train.usaco.org/usacogate2023-07-09 17:38:232
鄙人正在做ACM试题,请问现在有哪些大学有OJ?还请高手解答?
部分链接已经失效南开大学 http://acm.nankai.edu.cn/福州大学 http://acm.fzu.edu.cn/天津大学 http://cs.tju.edu.cn/acm/ 浙江大学 http://acm.zju.edu.cn/ 北京大学 http://acm.pku.edu.cn/JudgeOnline/ 同济大学 http://acm.tongji.edu.cn/ 四川大学 http://acm.scu.edu.cn/soj/ 中科大 http://acm.ustc.edu.cn/ 哈工大 http://acm.hit.edu.cn/ojs/ 汕头大学 http://acm.stu.edu.cn/ 武汉大学 http://acm.whu.edu.cn/ 华东师范 http://acm.cs.ecnu.edu.cn 厦门大学 http://acm.xmu.edu.cn 吉林大学 http://acm.jlu.edu.cn 南京大学 http://cot.nju.edu.cn/ 西南科大 http://222.196.33.254/JudgeOnline/ 哈工程 http://acm.hrbeu.edu.cn/ 湖南大学 http://acm.hnu.cn:8080/ 宁波理工 http://acm.nit.net.cn 福建师范 http://acm.fjnu.edu.cn/ 浙江师范 http://acm.zjnu.cn/ 南航 http://acm.nuaa.edu.cn/ 北航 http://acm.buaa.edu.cn/oj/浙江工大 http://acm.zjut.edu.cn/ 华中科大 http://acm.hust.edu.cn/judge/ 杭州电子科技 http://acm.hdu.edu.cn/VIJOS http://www.vijos.cn/ UVA http://online-judge.uva.es/problemset/ URAL http://acm.timus.ru/ SGU http://acm.sgu.ru/ SPOJ http://www.spoj.pl EL http://acm.mipt.ru/judge/problems.pl 洋文的-__-# KRSU http://www.olymp.krsu.edu.kg/ USACO http://train.usaco.org/usacogate建议做北大、浙大oj2023-07-09 17:38:323
网上哪个信息学(OI)题库可以下载到他的题目的数据?(除了TYVj)
推荐的网站可以接受~ 但是,一个人如果不知道大榕树,不知道OIBH,又何以能称为OIer哇~ 大榕树 OIBH 这两个网站,不知道伴随了多少OIer的成长~ 想提高看书不能少,做题更不能少。大多数选手都使用OnlineJudge来作为平时的训练工具的。英语不错的去USACO,URAL练习都是不错的主意。国内大学的系统如PKU,ZJU,TJU也非常有名。作为新手,只要选择其中一个题库做可以了,多做做自然就能熟悉OnlineJudge的提交和评测方。 USACO (USA Computing Olympiad) URAL (Ural State University) PKU 北京大学 ZJU 浙江大学2023-07-09 17:38:392
pascal的一些经典题型
第七届全国青少年信息学(计算机)奥林匹克分区联赛初赛试题(提高组PASCAL语言 二小时完成) 参考答案一、选择一个正确答案代码(A/B/C/D),填入每题的括号内(每题1.5分,多选无分,共30分)1、中央处理器CPU能访问的最大存储器容量取决于( ) A)地址总线 B)数据总线 C)控制总线 D)内存容量2、计算机软件保护法是用来保护软件( )的。 A)编写权 B)复制权 C)使用权 D)著作权3、64KB的存储器用十六进制表示,它的最大的地址码是( ) A)10000 B)FFFF C)1FFFF D)EFFFF4、在树型目录结构中,不允许两个文件名相同主要指的是( ) A)同一个磁盘的不同目录下 B)不同磁盘的同一个目录下 C)不同磁盘的不同目录下 C)同一个磁盘的同一个目录下5、下列设备哪一项不是计算机输入设备( ) A)鼠标 B)扫描仪 C)数字化仪 D)绘图仪6、在计算机硬件系统中,cache是( )存储器 A)只读 B)可编程只读 C)可擦除可编程只读 D)高速缓冲7、若我们说一个微机的CPU是用的PII300,此处的300确切指的是( ) A)CPU的主时钟频率 B)CPU产品的系列号 C)每秒执行300百万条指令 D)此种CPU允许最大内存容量8、Email邮件本质上是一个( ) A)文件 B)电报 C)电话 D)传真9、2KB的内存能存储( )个汉字的机内码 A)1024 B)516 C)2048 D)21810、以下对Windows的叙述中,正确的是( ) A)从软盘上删除的文件和文件夹,不送到回收站 B)在同一个文件夹中,可以创建两个同类、同名的文件 C)删除了某个应用程序的快捷方式,将删除该应用程序对应的文件 D)不能打开两个写字板应用程序11、运算式(2047)10—(3FF)16+(2000)8的结果是( ) A)(2048)10 B)(2049)10 C)(3746)8 D)(1AF7)1612、TCP/IP协议共有( )层协议 A)3 B)4 C)5 D)6 13.若已知一个栈的入栈顺序是1,2,3,…,n,其输出序列为P1,P2,P3,…,Pn,若P1是n,则Pi是( ) A)i B)n-1 C)n-i+1 D)不确定14.计算机病毒是( ) A)通过计算机传播的危害人体健康的一种病毒 B)人为制造的能够侵入计算机系统并给计算机带来故障的程序或指令集合 C)一种由于计算机元器件老化而产生的对生态环境有害的物质 D)利用计算机的海量高速运算能力而研制出来的用于疾病预防的新型病毒15.下面关于算法的错误说法是( ) A)算法必须有输出 B)算法必须在计算机上用某种语言实现 C)算法不一定有输入 D)算法必须在有限步执行后能结束16.[x]补码=10011000,其原码为( ) A)011001111 B)11101000 C)11100110 D)0110010117.以下哪一个不是栈的基本运算( ) A)删除栈顶元素 B)删除栈底的元素 C)判断栈是否为空 D)将栈置为空栈18.在顺序表(2,5,7,10,14,15,18,23,35,41,52)中,用二分法查找12,所需的关键码比较的次数为( ) A)2 B)3 C)4 D)519.一棵二叉树的高度为h,所有结点的度为0,或为2,则此树最少有( )个结点 A)2h-1 B)2h-1 C)2h+1 D)h+120.无向图G=(V,E),其中V={a,b,c,d,e,f} E={(a,b),(a,e),(a,c),(b,e),(c,f),(f,d),(e,d)} 对该图进行深度优先遍历,得到的顶点序列正确的是( ) A)a,b,e,c,d,f B)a,c,f,e,b,d C)a,e,b,c,f,d D)a,b,e,d,f,c二、问题求解(5+7=12分)1.已知一棵二叉树的结点名为大写英文字母,其中序与后序遍历的顺序分别为:CBGEAFHDIJ与CGEBHFJIDA则该二叉树的先序遍历的顺序为:2.平面上有三条平行直线,每条直线上分别有7,5,6个点,且不同直线上三个点都不在同一条直线上。问用这些点为顶点,能组成多少个不同四边形?三、阅读程序,写出程序正确的运行结果(4+7+8+9=28分)1.PROGRAM GAO7_1: FUNCTION ACK(M,N:INTEGER):INTEGER; BEGIN IF M=0 THEN ACK:=N+1 ELSE IF N=0 THEN ACK:=ACK(M-1,1) ELSE ACK:=ACK(M-1,ACK(M,N-1)) END; BEGIN WRITELN(ACK(3,4)); READLN; END.输出2.PROGRAM GAO7_2; VAR P,Q,S,T:INTEGER; BEGIN READLN(P); FOR Q:=P+1 TO 2*P DO BEGIN T:=0;S:=(P*Q)MOD(Q-P); IF S=0 THEN BEGIN T:=P+Q+(P*Q)DIV(Q-P);WRITE(T:4);END; END; END.输入12 输出3.PROGRAM GAO7_3; VAR I,J,H,M,N,K:INTEGER; B :ARRAY[1..10]OF INTEGER; BEGIN READLN(N); FOR I:=1 TO 10 DO BEGIN M:=N;J:=11; WHILE M>0 DO BEGIN J:=J-1;B[J]:=M MOD 10;M:=M DIV 10 END; FOR H:=J TO 10 DO N:=N+B[H]; END; WRITELN(N); END. 输入1234 输出:4.PROGRAM GAO7_4; VAR X,Y1,Y2,Y3:INTEGER; BEGIN READLN(X);Y1:=0;Y2:=1;Y3:=1; WHILE Y2<=X DO BEGIN Y1:=Y1+1;Y3:=Y3+2;Y2:=Y2+Y3 END; WRITELN(Y1); END.输入:23420 输出:四、完善程序(每空3分,共30分) 1.存储空间的回收算法。设在内存中已经存放了若干个作业A,B,C,D。其余的空间为可用的(如图一中(a))。 此时,可用空间可用一个二维数组dk[1..100,1..2 ]表示,(如下表一中(a)),其中:dk[i,1]对应第i个可用空间首址,dk[i,2]对应第i个可用空间长度如上图中,dk:100 50 300 100 50 100 0 0 100 50 300 100 500 100 10000 0 表一(a) 表一(b) 现某个作业释放一个区域,其首址为d,长度为L,此时将释放区域加入到可用空间表中。要求在加入时,若可用空间相邻时,则必须进行合并。因此出现下面的4种情况(如上图一(b)所示)。 (1)下靠,即回收区域和下面可用空间相邻,例如,d=80,L=20,此时成为表二中的(a)。 (2)上靠,例如,d=600,L=50,此时表成为表二中的(b)。 (3)上、下靠,例如,d=150,L=150,此时表成为表二中的(c)。 (4)上、下不靠,例如,d=430,L=20,此时表成为表二中的(d)。80 70300 10050 100 100 50300 100500 150 100 300500 100 100 50300 100430 20500 100表二(a)(下靠) 表二(b)(上靠) 表二(c)(上,下靠) 表二(d)(上,下不靠) 程序说明:对数组dk预置2个标志,即头和尾标志,成为表二中(b),这样可使算法简单,sp为dk表末地址。程序清单:PROGRAM GAO7_5; VAR I,J,SP,D,L:INTEGER; DK :ARRAY[0..100,1..2]OF INTEGER; BEGIN READLN(SP); FOR I:=1 TO SP DO READLN(DK[I,1],DK[I,2]); DK[0,1]:=0;DK[0,2]:=0; ① ; DK[SP,1]:=10000;DK[SP,2]:=0;READLN(D,L);I:=1; WHILE DK[I,1]<D DO I:=I+1; ② ; IF(DK[I,1]+DK[I,2]=D)THEN IF(D+L=DK[I+1,1])THEN BEGIN DK[I,2]:= ③ ; FOR J:=I+1 TO SP-1 DO DK[J]:=DK[J+1]; SP:=SP-1; END ELSE DK[I,2]:=DK[I,2]+LELSE IF(D+L=DK[I+1,1])THEN BEGIN DK[I+1,1]::= ④ ;DK[I+1,2]:=DK[I+1,2]+L END ELSE BEGIN FOR J:=SP DOWNTO I+1 DO DK[J+1]:=DK[J]; ⑤ :=D; DK[I+1,2]:=L;SP:=SP+1; END; FOR I:=1 TO SP-1 DO WRITELN(DK[I,1]:4,DK[I,2]:4);READLN;END.2.求关键路径 设有一个工程网络如下图表示(无环路的有向图): 其中,顶点表示活动,①表示工程开始,⑤表示工程结束(可变,用N表示),边上的数字表示活动延续的时间。 如上图中,活动①开始5天后活动②才能开始工作,而活动③则要等①、②完成之后才能开始,即最早也要7天后才能工作。 在工程网络中,延续时间最长的路径称为关键路径。上图中的关键路径为:①—②—③—④—⑤共18天完成。 关键路径的算法如下:1.数据结构: R[1..N,1..N]OF INTEGER; 表示活动的延续时间,若无连线,则用-1表示; EET[1..N] 表示活动最早可以开始的时间 ET[1..N] 表示活动最迟应该开始的时间 关键路径通过点J,具有如下的性质:EET[J]=ET[J]2.约定: 结点的排列已经过拓扑排序,即序号前面的结点会影响序号后面结点的活动。程序清单:PROGRAM GAO7_6; VAR I,J,N,MAX,MIN,W,X,Y:INTEGER; R:ARRAY[1..20,1..20] OF INTEGER; EET,ET:ARRAY[1..20] OF INTEGER; BEGIN READLN(N) FOR I:=1 TO N DO FOR J:=1 TO N DO R[I,J]:=-1; READLN(X,Y,W);{输入从活动X到活动Y的延续时间,以0为结束} WHILE X<>0 DO BEGIN R[X,Y]:=W; ① END; EET[1]:=0;{认为工程从0天开始} FOR I:=2 TO N DO BEGIN MAX:=0; FOR J:=1 TO N DO IF R[J,I]<>-1 THEN IF ② THEN MAX:=R[J,I]+EET[J]; EET[I]:=MAX; END; ③ FOR I:=N-1 DOWNTO 1 DO BEGIN MIN:=10000; FOR J:=1 TO N DO IF R[I,J]<>-1 THEN IF ④ THEN MIN:=ET[J] - R[I,J]; ET[I]:=MIN; END; WRITELN(EET[N]); FOR I:=1 TO N -1 DO IF ⑤ THEN WRITE(I,"→"); WRITE(N);READLNEND.2023-07-09 17:38:476
准备noi用什么书比较好
《算法竞赛入门经典》刘汝佳 入门经典啊~然后感觉直接看郭嵩山写的《国际大学生程序设计例题解》(好像有四册)比较好,语言一三册pascal,二四册c++;一三主要讲算法和相应题解(数论,搜索,计算几何,图论,动态规划等);二四则为题库型的,带讲解、测试数据和源代码。对noi用很不错的。还有就是《算法导论》最好有一本。《算法导论》确实是本好书,对于各种知识讲得都很全,即使有些相关知识没有仔细讲也会在课后习题或思考题里给出提示,根据提示上网查都能查到相关资料。导论的特色在于将严格的数学证明和算法设计结合在了一起,并且基本做到了面面俱到,当作一本工具书非常不错。导论的数学证明部分可能有些东西你没学,到大学里才会学到,比如群论的知识;不过没事,看不懂的地方直接跳过证明看算法就行,一般不会太难理解的。然后是《算法艺术与信息学竞赛》,这本书难度较大,不过提供的思路非常好。noi会出现很多noip中不会出现的知识,首先高级数据结构——并查集,线段数,树状数组,trie,后缀树等都是有可能的,其次算法方面——图论里的最小生成树,最短路,强连通分量及其缩点,网络流,二分图匹配等都有可能;动态规划——必考内容,而且难度一般较大一点,会加状态压缩或各种优化什么的(比如四边形不等式的优化),还有搜索啦,计算几何(凸包)啦之类的。题库不知道现在vijos发展的怎么样了,推荐去ACM/ICPC的题库做题,如北大,浙大,杭电的,题目非常多而且很全;不过acm的题基本全是英文的,英文不好就挂了,USACO也是个很不错的网站。我是山东的 ,上海那边不熟,反正我们这儿要先一等然后再集训,最后省选前几名。上网查查就好了。最后,祝你在noi的大舞台上展现自己的风采。呵呵~我不在参加noi了,上大学搞acm了,希望我的一点想法对你有所帮助。2023-07-09 17:39:053
跪求pascal题库
PASCAL基础题【程序1】题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?【程序2】题目:判断101-200之间有多少个素数,并输出所有素数。1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。 【程序3】题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。【程序4】题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。(2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n, 重复执行第一步。(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。【程序5】题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。1.程序分析:(a>b)?a:b这是条件运算符的基本例子。【程序6】题目:输入两个正整数m和n,求其最大公约数和最小公倍数。1.程序分析:利用辗除法。【程序7】题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。【程序8】题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。1.程序分析:关键是计算出每一项的值。【程序9】题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程 找出1000以内的所有完数。【程序10】题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高?【程序11】题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?【程序12】题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?1.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。 【程序13】题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足如下条件,即是结果。请看具体分析:【程序14】题目:输入某年某月某日,判断这一天是这一年的第几天?1.程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。【程序15】题目:输入三个整数x,y,z,请把这三个数由小到大输出。1.程序分析:我们想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换,然后再用x与z进行比较,如果x>z则将x与z的值进行交换,这样能使x最小。【程序16】题目:输出9*9口诀。1.程序分析:分行与列考虑,共9行9列,i控制行,j控制列。【程序17】题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下 的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。1.程序分析:采取逆向思维的方法,从后往前推断。【程序18】题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。 【程序19】 读入摄氏温度c,将它转换成华氏温度f输出,写出程序。已知:f=9/5*c+32【程序20】输入a,b,c,求一元二次方程ax2+bx+c=0的根。【程序21】依次输入10个学生的成绩,计算每个学生的成绩与平均成绩的差,并由此给出每个学生成绩的字母等级。如果成绩高于平均成绩10分以上为A等,与平均成绩相差在10分以内为B等,其余为C等。最后输出每个学生的编号,成绩和字母等级,每个学生占一行。【程序22】某屠宰场杀猪有一习惯,把每天要杀的n头猪按顺序排成一排,将排在单号位置的猪杀掉;然后把剩下的猪按上一次相对的位置排好,重新编号后再将排在单号位置的猪杀掉,重复前面的过程,直到剩下一头猪时停止杀猪,将这头猪放回,等待明天再杀。有一头聪明的猪摸准了这个规律,事先找好位置,使得它每天都不会被杀。求当总共有n头猪时,这个聪明的猪应该站在什么位置?(n由键盘输入)【解题指导】 采用数组存储猪的编号,即初始时利用循环语句令a[i]=i,接下来开始模拟杀猪过程,每次杀猪时,奇数位置的猪都被杀掉,偶数位置的猪重新编号,可以令a[i]=a[i]*2表示偶数的猪重新编号的情况,一次杀猪过程完后,猪的数量应该只剩n2头了,以这n2头猪为新的n重新杀猪,如此下去,直到n=1就表示只剩最后一头猪了。【程序23】编号为1,2,......,n的n个人按照顺时针方向围坐一圈。从第一个人开始顺时针方向自1开始报数,报到m时停止报数。报m 的人出列,从他在顺时针方向的下一个人开始重新报数,如此下去,直到所有人全部出列为止。设计一个程序来求出出列顺序。其中n,m由键盘输入。 【程序24】随机数产生时通常会有重复,现要求产生20个100以内的保证不重复的随机数存入数组,最后按从小到大的顺序输出这个数组,要求输出在同一行,每个元素之间用空格隔开。【程序25】某侦察队长接到一项紧急任务,要他在代号为A,B,C,D,E,F的六个侦察对员中选出若干人去侦察一件案子。由于每个侦察队员特长不同,针对这个案子,所需的人选必须注意以下几个条件: ⑴ A,B两人至少去一人; ⑵ A,D不能一起去; ⑶ 若D不去,则E也不去; ⑷ B,C两人都去或都不去; ⑸ C、D两人中去一人; ⑹ A、E、F三人中要派两人去。 请问应该让谁去?【程序26】让计算机产生一个1000以内的随机整数,从键盘上输入一个自然数,若正确,则输入猜对的提示,否则提示输入的数是大了还是小了。最后输出所猜的次数。【程序27】输入正整数a,对它进行质因式分解。例如: 输入:20 输出:20=2*2*5【程序28】用物理天平测量物体的质量时,测得物体的质量为a克(a为整数,并小于1千克),问:这时在天平的砝码盘中应有哪几个砝码?请选用最少数量的砝码(天平的砝码由下列质量的砝码组成:500克1个,200克1个,100克2个,50克1个.20克1个,10克2个,5克1个,2克2个,1克1个)。【程序29】设有n盏灯,放在一排,从1~n依次顺序编号。有n个人也从1到n依次编号。第1个人(1号)将灯全部关闭,第2个人(2号)将凡是2的倍数的打开,第3个人(3号)将凡是3的倍数的灯做相反处理(该灯如为打开的,则将它关闭,如关闭的则将它开),以后的人都和3号一样,将凡是自己号数倍数灯做相反处理。键盘输入n,输出最后还亮着的灯的编号,每个编号之间用空格隔开。【程序30】 有一推理题:警官在死者被害现场发现A、B、C、D四名犯罪嫌疑人。讯问中,A说“我没有杀人”,B说“C是凶手”,C说“杀人者肯定是D”,D说“C在冤枉好人”。现已知:四人中有三人说的是真话,一人说的是假话,四名犯罪嫌疑人中有且只有一人是凶手。请编程判断到底谁是真正的凶手。【程序31】输入一个十进制整数,输入对应的二进制数【程序32】某次运动会上,八位运动员的100M比赛成绩(单位:秒)如下: 运动员号码(Number) 100M比赛成绩(Score) 860 12.7 576 11.3 301 13.5 455 12.6 102 12.0 377 11.0 023 12.5 530 13.2 要求按100M比赛成绩(score)排序,显示出前三名运动员的号码和成绩。【解题指导】 最好利用记录类型存储运动员信息【程序33】在下面式子中的二个□内填入一个合适的同样的数字,使等式成立。 □3*6528=3□*8256 最后要求输出整个完整的等式。 【程序34】任何一个正整数的立方都可以写成一组相邻奇数之和。 如: 33=7+9+11=27 43==13+15+17+19=64 这就是尼科彻斯定理,请编写程序验证该定理,输出任意整数,输出格式参考下面的样例: 输入:4 输出:4(3)=13+15+17+19=64【程序35】来自不同国家的四位留学生A,B,C,D在一起交谈,他们只会中、英、法、日四种语言中的2种,情况是,没有人既会日语又会法语;A会日语,但D不会,A和D能互相交谈,B不会英语,但A和C交谈时却要B当翻译,B,C,D三个想互相交谈,但不到共同的语言,只有一种语言3人都会,请编程确定A,B,C,D四位留学生各会哪两种语言。【程序36】一辆以固定速度行驶的汽车,清晨司机看到里程表上从左到右的读数和从右到左的读数是相同的,这个数是95859,7小时后,里程表上又出现一个新的对称数。问此车的时速是多少(是一整数)?这个新的对称数是什么?设里程表为5位数字。 【程序37】小红今年12岁,她父亲比她大20岁,编一程序,计算出她的父亲在几年后比她年龄大一倍。那时他们的年龄各为多少?【程序38】某校一等奖学金认定办法如下: ⑴所考五门课成绩总分超过450分; ⑵每门课都在88分以上; ⑶前3门课(主课)每门成绩都在95以上,其他2门(非主课)每门成绩在80分以上。 凡满足上面任意一个条件都可认定为一等奖学金,输入某学生的5门课成绩,判定他是否能获得一等奖学金。窗体顶端窗体底端 【程序39】 利用下列公式计算并输出π的值: π/4=1-1/3+1/5-1/7+...+1/(4n-3)-1/(4n-1) n=10000【程序40】 输入两个整数,求出它们的最大公约数和最小公倍数。【程序41】计算表达式的值:s=1-1/2+1/3-1/4+…+1/99-1/100【程序42】 某商场近期搞优惠活动,优惠办法如下:购物不足250元的,没有折扣;购物满250元(含250,下同)不足500元的,减价5%;购物满500元不足1000元的,减价10%;购物满1000元不足2000元的,减价15%;购物满2000元的,减价20%。输入货款,计算顾客实际应付的金额。【程序43】用筛法求素数.(255以内)【程序44】高精度加法和减法【程序45】用递归方法求幂函数m^n.输入M,N求幂 【程序46】打印 1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 6 以下是回朔法部分【程序47】输出n,输出其排列数输入:3输出:123 132213231312321 【程序48】输出n,m,(n>m)输出组合数输入:5 3输出:123 124 125 134 135 145 234 235 245 345 【程序49】n皇后问题,在n*n棋盘上,求放n个皇后的方案数.输入:8输出:92 【程序50】老鼠走迷宫,n*n迷宫,1代表墙,0代表路,起点为(1,1),终点为(n,n),求一条最短的路.输入:40 1 0 00 0 0 01 0 1 10 0 0 0输出:(1,1)(2,1)(2,2)(3,2)(4,2)(4,3)(4,4) 6 【程序51】一个旅行者有一个最多能用m公斤的背包,现在有n件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为C1,C2,...,Cn.若每种物品只有一件求旅行者能获得最大总价值。输入:5 10 2 3 3 2 4 4 5 6 5 5输出:11 以下是查找和排序 【程序52】快速排序实现【程序53】二分查找实现【程序54】插入排序实现【程序55】冒泡排序实现2023-07-09 17:39:132
关于离散化的一些问题
"如果说今年这时候OIBH问得最多的问题是二分图,那么去年这时候问得最多的算是离散化了。对于“什么是离散化”,搜索帖子你会发现有各种说法,比如“排序后处理”、“对坐标的近似处理”等等。哪个是对的呢?哪个都对。关键在于,这需要一些例子和不少的讲解才能完全解释清楚。离散化是程序设计中一个非常常用的技巧,它可以有效的降低时间复杂度。其基本思想就是在众多可能的情况中“只考虑我需要用的值”。下面我将用三个例子说明,如何运用离散化改进一个低效的,甚至根本不可能实现的算法。"上面是网上的一些说法,我自己更通俗的理解是这样的..离散就是一种映射,在条件允许的情况下把大的范围缩合成小的,或把无序的根据题意变成有序,(离散嘛~~)那样问题就好解决的多...至于应用.~我也刚学,,不知道很多,,反正矩形覆盖肯定是最基础最经典的.使用范围的话.!我显然不知道,,题目做多了就知道了.举例的话,,我显然更不知道,电子书,我显然也没有,网上怎么都没找到,话说我要是有的话您就不可能没有.然后,最后,,我贴上我VIJOS上的矩形覆盖的程序,,- =如果说今年这时候OIBH问得最多的问题是二分图,那么去年这时候问得最多的算是离散化了。对于“什么是离散化”,搜索帖子你会发现有各种说法,比如“排序后处理”、“对坐标的近似处理”等等。哪个是对的呢?哪个都对。关键在于,这需要一些例子和不少的讲解才能完全解释清楚。离散化是程序设计中一个非常常用的技巧,它可以有效的降低时间复杂度。其基本思想就是在众多可能的情况中“只考虑我需要用的值”。下面我将用三个例子说明,如何运用离散化改进一个低效的,甚至根本不可能实现的算法。 如果说今年这时候OIBH问得最多的问题是二分图,那么去年这时候问得最多的算是离散化了。对于“什么是离散化”,搜索帖子你会发现有各种说法,比如“排序后处理”、“对坐标的近似处理”等等。哪个是对的呢?哪个都对。关键在于,这需要一些例子和不少的讲解才能完全解释清楚。离散化是程序设计中一个非常常用的技巧,它可以有效的降低时间复杂度。其基本思想就是在众多可能的情况中“只考虑我需要用的值”。下面我将用三个例子说明,如何运用离散化改进一个低效的,甚至根本不可能实现的算法。program t1056;const maxn =maxlongint;type selftype =array[0..201]of longint;var x1,x2,y1,y2,dx,dy :selftype; n,i,j,tot :longint;procedure readin;//读入,然后离散.var i,j :longint;begin fillchar(dx,sizeof(dx),0); fillchar(dy,sizeof(dy),0); fillchar(x1,sizeof(x1),0); fillchar(x2,sizeof(x2),0); fillchar(y1,sizeof(y1),0); fillchar(y2,sizeof(y2),0); readln(n); for i:=1 to n do begin readln(x1[i],y1[i],x2[i],y2[i]); dx[i+i-1]:=x1[i]; dx[i+i] :=x2[i]; dy[i+i-1]:=y1[i]; dy[i+i] :=y2[i]; end; for i:=1 to n+n-1 do for j:=i+1 to n+n do begin if dx[i]=dx[j] then dx[j]:=maxn; if dy[i]=dy[j] then dy[j]:=maxn; end; dx[n+n+1]:=maxn; dy[n+n+1]:=maxn;end;procedure qsort(x,y:longint;var a:selftype);//X,Y轴的排序var i,j,k :longint;begin i:=x;j:=y;k:=a[i]; repeat while(i<j)and(a[j]>=k)do dec(j); if(i<>j)and(a[j]<k)then begin a[i]:=a[j];inc(i);end; while(i<j)and(a[i]<=k)do inc(i); if(i<>j)and(a[i]>k)then begin a[j]:=a[i];dec(j);end; until i=j; a[i]:=k; if x<i-1 then qsort(x,i-1,a); if y>i+1 then qsort(i+1,y,a);end;procedure solve;//算面积.var i,o,i1,i2,j1,j2,p,q,j :longint; f :array[0..201,0..201]of boolean;begin dx[0]:=0; while dx[dx[0]+1]<maxn do inc(dx[0]); dy[0]:=0; while dy[dy[0]+1]<maxn do inc(dy[0]); fillchar(f,sizeof(f),false); for o:=1 to n do begin for i1:=1 to dx[0] do if dx[i1]=x1[o] then break; for i2:=1 to dx[0] do if dx[i2]=x2[o] then break; for j1:=1 to dy[0] do if dy[j1]=y1[o] then break; for j2:=1 to dy[0] do if dy[j2]=y2[o] then break; for p:=i1 to i2-1 do for q:=j1 to j2-1 do f[p,q]:=true; end; tot:=0; for i:=1 to dx[0]-1 do for j:=1 to dy[0]-1 do if f[i,j] then begin o:=abs(dx[i]-dx[i+1]); o:=o*abs(dy[j]-dy[j+1]); tot:=tot+o; end; writeln(tot);end;begin readin; qsort(1,2*n,dx); qsort(1,2*n,dy); solve;end. okok.. 亲耐哒弟弟给分.~~2023-07-09 17:39:311
平面点集最接近点对问题怎么做
你那个已经是分治法了...但是似乎有点问题给你贴一份我的代码.#include<cstdio>#include<cstdlib>#include<cmath>using namespace std;class point{ public: double x,y; int pos; point(){x=y=pos=0;} point(const point &s){x=s.x;y=s.y;pos=s.pos;} bool operator > (const point &s) { return x>s.x?true:false; } bool operator < (const point &s) { return y<s.y?true:false; }};point x[100001],y[100001],z[100001];int n;int cmpx(const void *t1,const void *t2){ return (*(point *)t1).x>(*(point *)t2).x?1:-1;}int cmpy(const void *t1,const void *t2){ return (*(point *)t1).y>(*(point *)t2).y?1:-1;}inline double min(double t1,double t2){ return (t1<t2)?t1:t2;}void Merge(point *t1,point *t2,int st,int ed){ int p1=st; int p2=(st+ed)/2+1; int p3=st; while(p1<=(st+ed)/2&&p2<=ed) { if(t2[p1]<t2[p2])t1[p3++]=t2[p1++]; else t1[p3++]=t2[p2++]; } while(p1<=(st+ed)/2) t1[p3++]=t2[p1++]; while(p2<=ed) t1[p3++]=t2[p2++];}inline double dist(point &t1,point &t2){ double dx=t1.x-t2.x; double dy=t1.y-t2.y; return sqrt(dx*dx+dy*dy);}void divide(point *x1,point *y1,point *z1,int st,int ed,int &p1,int &p2,double &best){ if(ed-st==1) { p1=st; p2=ed; best=dist(x[p1],x[p2]); return; } if(ed-st==2) { double d1=dist(x[st],x[st+1]); double d2=dist(x[st+1],x[ed]); double d3=dist(x[st],x[ed]); double d=min(d1,d2); d=min(d,d3); if(d==d1) { p1=st; p2=st+1; } else if(d==d2) { p1=st+1; p2=ed; } else { p1=st; p2=ed; } best=d; return; } int mid=(st+ed)/2; int cnt=st; int cnt1=mid+1; for(int i=st;i<=ed;i++) if(y1[i].pos>mid)z1[cnt1++]=y[i]; else z1[cnt++]=y[i]; int p12,p22; double bestd; divide(x1,z1,y1,st,mid,p12,p22,bestd); int p11,p21; double bestd1; divide(x1,z1,y1,mid+1,ed,p11,p21,bestd1); if(bestd1<bestd){p12=p11;p22=p21;bestd=bestd1;} p1=p12; p2=p22; best=bestd; Merge(y1,z1,st,ed); int l=st; for(int i=st;i<=ed;i++) if(abs(x1[i].x-x1[mid].x)<bestd) { z1[l++]=x1[i]; z1[l-1].pos=i; } for(int i=st;i<l;i++) for(int j=i+1;j<l;j++) if(dist(z1[i],z1[j])<bestd) { p1=z1[i].pos; p2=z1[j].pos; best=dist(z1[i],z1[j]); }}int main(void){ FILE *fin=fopen("input.txt","r"); FILE *fout=fopen("output.txt","w"); fscanf(fin,"%d",&n); for(int i=0;i<n;i++) fscanf(fin,"%lf %lf",&x[i].x,&x[i].y); qsort(x,n,sizeof(point),cmpx); for(int i=0;i<n;i++) { y[i].x=x[i].x; y[i].y=x[i].y; y[i].pos=i; } qsort(y,n,sizeof(point),cmpy); for(int i=0;i<n;i++) x[y[i].pos].pos=i; int p1,p2; double bestd; divide(x,y,z,0,n-1,p1,p2,bestd); fprintf(fout,"%.3lf ",bestd); fclose(fin); fclose(fout); return 0;}还有,你那个代码应该会爆Access Violation的才对...你可以对比一下咱们的代码.(p.s.我的代码在Vijos上P1012 Accepted.)2023-07-09 17:39:381
free pascal题目
【顺序结构题目】1、 输入圆的半径,输出圆的面积和周长。2、 输入长方形长和高,输出长方形周长和面积。3、 输入梯形上底、下底、高,求梯形面积。4、 输出两个自然数相除的商和余数。5、自然数的立方可以表示为两个整数的平方之差,比如43=102-62,请输出自然数1996的这种表示形式。(这里的43用自乘三次的形式4*4*4表示;102也用自乘二次的形式10*10表示)6、 用字符输出一个猪锦佳的头像。7、 a,b,c分别等于1、12、123,把它们按向左对齐、向右对齐的方式打印出来。8、 输入一个四位整数,把它的各位数字倒序输出。(提示:用MOD和DIV运算完成)9、 从键盘上读入小写的"pascal",利用CHR()和ORD()函数,输出大写的"PASCAL"。10、 从键盘上读入一个实数,利用ROUND()和TRUNC()函数,输出该实数本身、整数部分、小数部分、四舍五入后的值。要求:分三行输出 ;输出实数本身时,格式与读入时相同;整数部分、小数部分在同一行输出;其它各占一行。11、 输入一个时、分、秒,把它转换为一个秒数。12、输入一个秒数,把它变成00:00:00的形式。13、输入三角形三个边,输出三角形面积。(利用海伦公式) P=(a+b+c)/2 s=sqrt(p*(p-a)*(p-b)*(p-c))14、输入2个数值A和B,交换2个数值。15、分钱游戏。甲、乙、丙三人共有24元钱,先由甲分钱给乙、丙两人,所分给的数与各人已有数相同;接着由乙分给甲、丙,分法同前;再由丙分钱给甲、乙,分法亦同前。经上述三次分钱之后,每个人的钱数恰好一样多。 求原先各人的钱数分别是多少?16、有鸡兔同笼,头30,脚 90,究竟笼中的鸡和兔各有多少只?17、.某车棚存有自行车和三轮车共65辆,它们的轮子数合计为150个。求该棚内存有的自行车和三轮车各是多少辆?18、甲、乙、丙三人分别有磁带36,48,64盒。先由甲把自己的磁带平均分为三份,分给乙、丙各一份,自己留下一份;接着是乙,最后是丙,都按甲的方法处理。编程输出甲、乙、丙在上述过程中各人的磁带数分别是多少? (输出所有的中间结果)19、五位好朋友相聚。第一位朋友带来了很多糖块赠送给各位朋友,使每人的糖块在各自原有的基础上翻了一倍;接着第二位好友也同样向每人赠送糖块,他同样使每人的糖块在各人已有的数量上翻了一倍;第三、第四、第五位好友都照此办理。经过这样的赠送之后,每人的糖块恰好都为32块。问各位好友原先的糖块数分别是多少?【选择结构题目】 (1) if 条件 then 语句; (2) if 条件 then 语句1 else 语句2;1、 输入两个数a,b,输出较大数的平方值。2、输入两个数a,b,输出较大的数。3、读入三个不同的数,编程按由小到大的顺序排列打印出来。4、某全自动加油站a,b,c三种汽油的单价(元/kg)分别是1.50、1.35和1.18,也提供了“自己加”或“协助加”两个服务等级,这样用户可以得到5%或10%的优惠。编一个程序,用户输入加油量、汽油品种和服务类型(f-自动,m-自己,e-协助),然后计算应付款。5、某服装公司为了推销产品,采取这样的批发销售方案:凡订购超过100 套的,每套定价为50元,否则每套价格为80元。编程由键盘输入订购套数,输出应付款的金额数。6、 铁路托运行李规定:行李重不超过50公斤的,托运费按每公斤0.15元计费;如超50公斤,超过部分每公斤加收0.10元。编一程序完成自动计费工作。7、 某超市为了促销,规定:购物不足50元的按原价付款,超过50不足100的按九折付款,超过100元的,超过部分按八折付款。编一程序完成超市的自动计费的工作。8、 当前小学生的成绩单由以前的百分制改为优秀、良好、合格、不合格四个等级的等级制。编一程序完成分数的自动转换工作。转换规则如下:60分以下的为不合格;60到69分为合格;70到89分为良好;90分以上的为优秀。(提示:可以利用DIV运算来使程序更简明)9、 打印某年某月有多少天。(提示:A、闰年的计算方法:年数能被4整除,并且不能被100整除;或者能被400整除的整数年份。B、利用MOD运算可以判断一个数能否被另一个数整除)10、编程模拟剪刀、石头、布游戏:用S表示剪刀,用R表示石头,用P表示布。规则是:剪刀剪布,石头砸剪刀,布包石头。游戏者分别把自己的选择输入,计算机给出结果。 Case 表达式 of 情况常量表1: 语句1; 情况常量表2: 语句2; : : 情况常量表n: 语句n end;11、对某产品征收税金,在产值1万元以上征收税5%;在1万元以下但在5000元以上的征收税3%;在5000元以下但在1000元以上征收税2%;1000元以下的免收税。编程计算该产品的收税金额。12、运输公司计算运费时,距离(S)越长,每公里运费越低,标准如下: 如果S<250公里;运费为标准运价的100% 如果250公里<=S<500公里,运费为标准运价的98%; 如果500公里<=S<1000公里,运费为标准运价的95%; 如果1000公里<=S<2000公里,运费为标准运价的92%; 如果2000公里<=S<3000公里,运费为标准运价的90%; 如果S=>3000公里,运费为标准运价的85%;。请编计算运费的程序。13、 输入考试成绩,如果获85分以上为 A等,获60分~84分为B等,60分以下为C等,编程输出考试等级。14、 某车间按工人加工零件的数量发放奖金,奖金分为五个等级:每月加工零件数N < 100者奖金为10元;100 < = N < 110者奖金为30元;110 < = N <120 者奖金为50元;120 < = N <130 者奖金为70元;N > 130者为80元。请编程,由键盘输入加工零件数量,显示应发奖金数。15、从键盘上读入年和月,输出该月有多少天。【循环语句】for 循环语句有两种格式:(1) for 循环变量:=初值 To 终值 do 语句; (2) for 循环变量:=初值 downto 终值 do 语句;while 布尔表达式 do 语句;repeat 循环体语句;until 条件表达式; {直到条件为真}1、 计算下列式子的值:(1)1+2+……+100(2)1+3+5+……+97+99(3)1-3+5-7+9-11+……n2、求水仙花数。所谓水仙花数,是指一个三位数abc,如果满足a^3+b^3+c^3=abc,则abc是水仙花数。3、宰相的麦子:相传古印度宰相达依尔,是国际象棋的发明者。有一次,国王因为他的贡献要奖励他,问他想要什么。达依尔说:“只要在国际象棋棋盘上(共64格)摆上这么些麦子就行了:第一格一粒,第二格两粒,……,后面一格的麦子总是前一格麦子数的两倍,摆满整个棋盘,我就感恩不尽了。”国王一想,这还不容易,刚想答应,如果你这时在国王旁边站着,你会不会劝国王别答应,为什么?4、百钱百鸡。公鸡5块,母鸡3块,小鸡1块3支。6、打印下列图案:(输入N值来控制图案的规模,下列图案均以N=3为例)& & & & & && & && & && & & * * * * * * * * *# @ *# # @ @ * *# # # @ @ @ * * *7、输入20个数,按照5个一行输出。8、一个两位数x,将它的个位数字与十位数字对调后得到一个新数y,此时y恰好比x大36,请编程求出所有这样的两位数。9、把整数3025从中剪开分为30和25两个数,此时再将这两数之和平方,(30+25)2=3025计算结果又等于原数。求所有符合这样条件的四位数。10、打印出九九乘法表:11、从七张扑克牌中任取三张,有几种组合方法?请编程输出所有组合形式。12、数学上把除了1和它本身,没有别的数能够整除它的自然数叫做素数(或质数)。现在由键盘输入一个自然数N,编程判断N是否是素数,是则输出“Yes”,否则输出“No”。13、输出1000以内所有的素数。14、一辆快车和一辆慢车开往同一地点,快车票价为18元,慢车票价为13. 5元,共售出400张,共计5940元,求快车票和慢车票各多少张?15、在下面式子中的二个□内填入一个合适的同样的数字,使等式成立。 □3*6528=3□*825616、有一个三位数,它的各位数字之和的11倍恰好等于它自身,请编程求出这个三位数。17、在自然数中,如果一个三位数等于自身各位数字之立方和,则这个三位数就称为是水仙花数。如:153=13+53+33,所以153是一个水仙花数。求所有的水仙花数。18、编程序打印出下列图案:平行四边形 等腰三解形 菱形 ****** * * ****** *** *** ****** ***** ***** ****** ******* ********* ********* *19、编程打印出如下图案: 1 222 33333 4444444 555555555 20、有三种明信片:第一种每套一张,售价2元;第二种每套一张,售价4元; 第三种每套9张,售价2元。现用100元钱要买100张明信片,要求每种明信片至少要买一套,问三种明信片应各买几套?请输出全部购买方案。21、某人想把一元钱换成伍分、贰分、壹分这样的零钱, 在这三种零钱中每种零钱都至少各有一个的情况下,共有多少种兑换方案。并打出这些方案。22、A、B两个自然数的和、差、积、商四个数加起来等于243,求A、B两数。23、求两个数的最小公倍数和最大公约数。24、编写一个译码程序,把一个英语句子译成数字代码。译码规则是以数字1代替字母A,数字2代替字母B,……,26代替字母Z,如遇空格则打印一个星号‘*",英文句子以‘.‘结束。25、输入一个正整数N,把它分解成质因子相乘的形式。 如:36=1 X 2 X 2 X 3 X 3; 19=1 X 19 (提示:设因子为I,从2开始到N,让N重复被I除,如果能整除,则用商取代N,I为一个因子;如果不能整除,再将I增大,继续以上操作,直到I等于N。)26、校体操队到操场集合,排成每行2人,最后多出1人;排成每行3人,也多出1人;分别按每行排4,5,6人,都多出1人;当排成每行7人时,正好不多。求校体操队至少是多少人?27、从键盘输入一个整数X(X不超过10000),若X的各位数字之和为7的倍数,则打印“Yes”,否则中打印“No”。28、求1992个1992的乘积的末两位数是多少?29、尼科彻斯定理:将任何一个正整数的立方写成一组相邻奇数之和。 如: 33=7+9+11=27 43=13+15+17+19=6430、猜价格:中央电视台的“幸运52”栏目深受观众喜爱,其中的“猜商品价格”的节目更是脍炙人口,现在请你编一个程序模拟这一游戏:由计算机随机产生200至5000之间的一个整数,作为某件商品的价格,然后由你去猜是多少,若你猜的数大了,则计算机输出提示“Gao”,若你猜的数小了,则计算机输出提示“Di”,然后你根据提示继续猜,直到你猜对了,计算机会提示“Ok”,并统计你猜的总次数。解:本题的游戏规则大家都清楚,要完成程序,必须把处理步骤理清: (1)用随机函数Random产生200至5000之间的一个整数X; (2)你猜一个数A; (3)若A>X,则输出“Gao”;(4)若A<X,则输出“Di”;(5)若A=X则输出“Ok”;(6)重复(2)(3)(4)(5)直到A=X。31、小会议室里有几条相同的长凳,有若干人参加开会。如果每条凳子坐6人,结果有一条凳子只坐有3人;如果每条凳子坐5人,就有4人不得不站着。求会议室里有多少人开会,有多少条长凳?32、某动物饲养中心用1700元专款购买小狗(每只31元)和小猫(每只21元)两种小动物。要求专款专用,正好用完, 应当如何购买?请输出所有方案。33、某整数X加上100就成为一个完全平方数,如果让X加上168 就成为另一个完全平方数。求X?34、某次同学聚会,老同学见面个个喜气洋洋,互相握手问好。参加此次聚会者每人都与老同学握了一次手,共握903次,试求参加聚会的人数?35、用自然数300,262,205,167分别除以某整数A,所得到的余数均相同。求出整数A以及相除的余数?36、1600年前我国的一部经典数学著作中有题:“今有物,不知其数,三三数之,剩二;五五数之,剩三;七七数之,剩二,问物几何。”求最小解。37、编程求出所有不超过1000的数中,含有数字3的自然数,并统计总数。38、阿姆斯特朗数:如果一个正整数等于其各个数字的立方和,则该数称为阿姆斯特朗数(也称自恋数),如407=43+03+73,试编程求出1000以内的所有阿姆斯特朗数。39、将一根长为369cm的钢管截成长为69cm和39cm两种规格的短料。在这两种规格的短料至少各截一根的前提下, 如何截才能余料最少。40、甲、乙、丙三人都是业余射击爱好者, 在一次练习中他们枪枪中靶: 甲射了八发子弹,取得225环成绩,乙射了七发,也取得225环;丙只射了六发,同样取得225环。下面是成绩表,请编程完成下表中空项的填数。41、求S= 1-1/2 +1/3-1/4+1/5-1/6+ ……(求前N项的和)42、Faibonacci数列前几项为: 0,1,1,2,3,5,8,…,其规律是从第三项起, 每项均等于前两项之和。求前30项, 并以每行5个数的格式输出。43.小球从100高处自由落下,着地后又弹回高度的一半再落下。求第20次着地时, 小球共通过多少路程?44.某登山队员第一天登上山峰高度的一半又24米; 第二天登上余下高度的一半又24米;每天均如此。到第七天,距山顶还剩91米。求此山峰的高度?45.给出某整数N,将N写成因数相乘的形式。如: N=12,输出: 12=1*2*2*3.46.出售金鱼者决定将缸里的金鱼全部卖出。第一次卖出全部金鱼的一半加二分之一条;第二次卖出剩余的三分之一加三分之一条金鱼;第三次卖出余下金鱼的四分之一加四分之一条;第四次卖出余下的五分之一加五分之一条金鱼。还剩下11条金鱼。当然,出售金鱼时都是整数条,不能有任何破损。求缸里原有的金鱼数?47.外出旅游的几位朋友决定次日早晨共分一筐苹果。天刚亮,第一个人醒来,他先拿了一个,再把筐里的八分之一拿走;第二个人醒来,先拿两个,再把筐里的八分之一拿走;第三个人醒来,先拿三个,再拿走筐里的八分之一;…每个人依次照此方法拿出各人的苹果,最后筐里的苹果全部拿完,他们每人所拿到的苹果数正巧一样多。求原先筐里的苹果数和人数。48.图中由6个圆圈构成三角形,每条边上有三个圈, 将自然数1--6 不重复地填入各圆圈位置上,使每条边圆圈上的数字之和相等,请编程输出所有的填法。49、求n!50、求1!+2!+……+n!2023-07-09 17:39:496
200分求动态规划详解!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
P01: 01背包问题题目有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。基本思路这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的。所以有必要将它详细解释一下:“将前i件物品放入容量为v的背包中”这个子问题,若只考虑第i件物品的策略(放或不放),那么就可以转化为一个只牵扯前i-1件物品的问题。如果不放第i件物品,那么问题就转化为“前i-1件物品放入容量为v的背包中”,价值为f[i-1][v];如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为v-c[i]的背包中”,此时能获得的最大价值就是f[i-1][v-c[i]]再加上通过放入第i件物品获得的价值w[i]。优化空间复杂度以上方法的时间和空间复杂度均为O(VN),其中时间复杂度应该已经不能再优化了,但空间复杂度却可以优化到O。先考虑上面讲的基本思路如何实现,肯定是有一个主循环i=1..N,每次算出来二维数组f[i][0..V]的所有值。那么,如果只用一个数组f[0..V],能不能保证第i次循环结束后f[v]中表示的就是我们定义的状态f[i][v]呢?f[i][v]是由f[i-1][v]和f[i-1][v-c[i]]两个子问题递推而来,能否保证在推f[i][v]时(也即在第i次主循环中推f[v]时)能够得到f[i-1][v]和f[i-1][v-c[i]]的值呢?事实上,这要求在每次主循环中我们以v=V..0的顺序推f[v],这样才能保证推f[v]时f[v-c[i]]保存的是状态f[i-1][v-c[i]]的值。伪代码如下:for i=1..N for v=V..0 f[v]=max{f[v],f[v-c[i]]+w[i]};其中的f[v]=max{f[v],f[v-c[i]]}一句恰就相当于我们的转移方程f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]},因为现在的f[v-c[i]]就相当于原来的f[i-1][v-c[i]]。如果将v的循环顺序从上面的逆序改成顺序的话,那么则成了f[i][v]由f[i][v-c[i]]推知,与本题意不符,但它却是另一个重要的背包问题P02最简捷的解决方案,故学习只用一维数组解01背包问题是十分必要的。事实上,使用一维数组解01背包的程序在后面会被多次用到,所以这里抽象出一个处理一件01背包中的物品过程,以后的代码中直接调用不加说明。过程ZeroOnePack,表示处理一件01背包中的物品,两个参数cost、weight分别表明这件物品的费用和价值。procedure ZeroOnePack(cost,weight) for v=V..cost f[v]=max{f[v],f[v-cost]+weight}注意这个过程里的处理与前面给出的伪代码有所不同。前面的示例程序写成v=V..0是为了在程序中体现每个状态都按照方程求解了,避免不必要的思维复杂度。而这里既然已经抽象成看作黑箱的过程了,就可以加入优化。费用为cost的物品不会影响状态f[0..cost-1],这是显然的。有了这个过程以后,01背包问题的伪代码就可以这样写:for i=1..N ZeroOnePack(c[i],w[i]);初始化的细节问题我们看到的求最优解的背包问题题目中,事实上有两种不太相同的问法。有的题目要求“恰好装满背包”时的最优解,有的题目则并没有要求必须把背包装满。一种区别这两种问法的实现方法是在初始化的时候有所不同。如果是第一种问法,要求恰好装满背包,那么在初始化时除了f[0]为0其它f[1..V]均设为-∞,这样就可以保证最终得到的f[N]是一种恰好装满背包的最优解。如果并没有要求必须把背包装满,而是只希望价格尽量大,初始化时应该将f[0..V]全部设为0。为什么呢?可以这样理解:初始化的f数组事实上就是在没有任何物品可以放入背包时的合法状态。如果要求背包恰好装满,那么此时只有容量为0的背包可能被价值为0的nothing“恰好装满”,其它容量的背包均没有合法的解,属于未定义的状态,它们的值就都应该是-∞了。如果背包并非必须被装满,那么任何容量的背包都有一个合法解“什么都不装”,这个解的价值为0,所以初始时状态的值也就全部为0了。这个小技巧完全可以推广到其它类型的背包问题,后面也就不再对进行状态转移之前的初始化进行讲解。一个常数优化前面的伪代码中有 for v=V..1,可以将这个循环的下限进行改进。由于只需要最后f[v]的值,倒推前一个物品,其实只要知道f[v-w[n]]即可。以此类推,对以第j个背包,其实只需要知道到f[v-sum{w[j..n]}]即可,即代码中的for i=1..N for v=V..0可以改成for i=1..n bound=max{V-sum{w[i..n]},c[i]} for v=V..bound这对于V比较大时是有用的。小结01背包问题是最基本的背包问题,它包含了背包问题中设计状态、方程的最基本思想,另外,别的类型的背包问题往往也可以转换成01背包问题求解。故一定要仔细体会上面基本思路的得出方法,状态转移方程的意义,以及最后怎样优化的空间复杂度。P02: 完全背包问题题目有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。基本思路这个问题非常类似于01背包问题,所不同的是每种物品有无限件。也就是从每种物品的角度考虑,与它相关的策略已并非取或不取两种,而是有取0件、取1件、取2件……等很多种。如果仍然按照解01背包时的思路,令f[i][v]表示前i种物品恰放入一个容量为v的背包的最大权值。仍然可以按照每种物品不同的策略写出状态转移方程,像这样:f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k*c[i]<=v}这跟01背包问题一样有O(VN)个状态需要求解,但求解每个状态的时间已经不是常数了,求解状态f[i][v]的时间是O(v/c[i]),总的复杂度可以认为是O(V*∑(V/c[i])),是比较大的。将01背包问题的基本思路加以改进,得到了这样一个清晰的方法。这说明01背包问题的方程的确是很重要,可以推及其它类型的背包问题。但我们还是试图改进这个复杂度。一个简单有效的优化完全背包问题有一个很简单有效的优化,是这样的:若两件物品i、j满足c[i]<=c[j]且w[i]>=w[j],则将物品j去掉,不用考虑。这个优化的正确性显然:任何情况下都可将价值小费用高得j换成物美价廉的i,得到至少不会更差的方案。对于随机生成的数据,这个方法往往会大大减少物品的件数,从而加快速度。然而这个并不能改善最坏情况的复杂度,因为有可能特别设计的数据可以一件物品也去不掉。这个优化可以简单的O(N^2)地实现,一般都可以承受。另外,针对背包问题而言,比较不错的一种方法是:首先将费用大于V的物品去掉,然后使用类似计数排序的做法,计算出费用相同的物品中价值最高的是哪个,可以O(V+N)地完成这个优化。这个不太重要的过程就不给出伪代码了,希望你能独立思考写出伪代码或程序。转化为01背包问题求解既然01背包问题是最基本的背包问题,那么我们可以考虑把完全背包问题转化为01背包问题来解。最简单的想法是,考虑到第i种物品最多选V/c[i]件,于是可以把第i种物品转化为V/c[i]件费用及价值均不变的物品,然后求解这个01背包问题。这样完全没有改进基本思路的时间复杂度,但这毕竟给了我们将完全背包问题转化为01背包问题的思路:将一种物品拆成多件物品。更高效的转化方法是:把第i种物品拆成费用为c[i]*2^k、价值为w[i]*2^k的若干件物品,其中k满足c[i]*2^k<=V。这是二进制的思想,因为不管最优策略选几件第i种物品,总可以表示成若干个2^k件物品的和。这样把每种物品拆成O(log V/c[i])件物品,是一个很大的改进。但我们有更优的O(VN)的算法。O(VN)的算法这个算法使用一维数组,先看伪代码:for i=1..N for v=0..V f[v]=max{f[v],f[v-cost]+weight}你会发现,这个伪代码与P01的伪代码只有v的循环次序不同而已。为什么这样一改就可行呢?首先想想为什么P01中要按照v=V..0的逆序来循环。这是因为要保证第i次循环中的状态f[i][v]是由状态f[i-1][v-c[i]]递推而来。换句话说,这正是为了保证每件物品只选一次,保证在考虑“选入第i件物品”这件策略时,依据的是一个绝无已经选入第i件物品的子结果f[i-1][v-c[i]]。而现在完全背包的特点恰是每种物品可选无限件,所以在考虑“加选一件第i种物品”这种策略时,却正需要一个可能已选入第i种物品的子结果f[i][v-c[i]],所以就可以并且必须采用v=0..V的顺序循环。这就是这个简单的程序为何成立的道理。值得一提的是,上面的伪代码中两层for循环的次序可以颠倒。这个结论有可能会带来算法时间常数上的优化。这个算法也可以以另外的思路得出。例如,将基本思路中求解f[i][v-c[i]]的状态转移方程显式地写出来,代入原方程中,会发现该方程可以等价地变形成这种形式:f[i][v]=max{f[i-1][v],f[i][v-c[i]]+w[i]}将这个方程用一维数组实现,便得到了上面的伪代码。最后抽象出处理一件完全背包类物品的过程伪代码:procedure CompletePack(cost,weight) for v=cost..V f[v]=max{f[v],f[v-c[i]]+w[i]}总结完全背包问题也是一个相当基础的背包问题,它有两个状态转移方程,分别在“基本思路”以及“O(VN)的算法“的小节中给出。希望你能够对这两个状态转移方程都仔细地体会,不仅记住,也要弄明白它们是怎么得出来的,最好能够自己想一种得到这些方程的方法。事实上,对每一道动态规划题目都思考其方程的意义以及如何得来,是加深对动态规划的理解、提高动态规划功力的好方法。P03: 多重背包问题题目有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。基本算法这题目和完全背包问题很类似。基本的方程只需将完全背包问题的方程略微一改即可,因为对于第i种物品有n[i]+1种策略:取0件,取1件……取n[i]件。令f[i][v]表示前i种物品恰放入一个容量为v的背包的最大权值,则有状态转移方程:f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k<=n[i]}复杂度是O(V*∑n[i])。转化为01背包问题另一种好想好写的基本方法是转化为01背包求解:把第i种物品换成n[i]件01背包中的物品,则得到了物品数为∑n[i]的01背包问题,直接求解,复杂度仍然是O(V*∑n[i])。但是我们期望将它转化为01背包问题之后能够像完全背包一样降低复杂度。仍然考虑二进制的思想,我们考虑把第i种物品换成若干件物品,使得原问题中第i种物品可取的每种策略——取0..n[i]件——均能等价于取若干件代换以后的物品。另外,取超过n[i]件的策略必不能出现。方法是:将第i种物品分成若干件物品,其中每件物品有一个系数,这件物品的费用和价值均是原来的费用和价值乘以这个系数。使这些系数分别为1,2,4,...,2^(k-1),n[i]-2^k+1,且k是满足n[i]-2^k+1>0的最大整数。例如,如果n[i]为13,就将这种物品分成系数分别为1,2,4,6的四件物品。分成的这几件物品的系数和为n[i],表明不可能取多于n[i]件的第i种物品。另外这种方法也能保证对于0..n[i]间的每一个整数,均可以用若干个系数的和表示,这个证明可以分0..2^k-1和2^k..n[i]两段来分别讨论得出,并不难,希望你自己思考尝试一下。这样就将第i种物品分成了O(log n[i])种物品,将原问题转化为了复杂度为<math>O(V*∑log n[i])的01背包问题,是很大的改进。下面给出O(log amount)时间处理一件多重背包中物品的过程,其中amount表示物品的数量:procedure MultiplePack(cost,weight,amount) if cost*amount>=V CompletePack(cost,weight) return integer k=1 while k<amount ZeroOnePack(k*cost,k*weight) amount=amount-k k=k*2 ZeroOnePack(amount*cost,amount*weight)希望你仔细体会这个伪代码,如果不太理解的话,不妨翻译成程序代码以后,单步执行几次,或者头脑加纸笔模拟一下,也许就会慢慢理解了。O(VN)的算法多重背包问题同样有O(VN)的算法。这个算法基于基本算法的状态转移方程,但应用单调队列的方法使每个状态的值可以以均摊O(1)的时间求解。由于用单调队列优化的DP已超出了NOIP的范围,故本文不再展开讲解。我最初了解到这个方法是在楼天成的“男人八题”幻灯片上。小结这里我们看到了将一个算法的复杂度由O(V*∑n[i])改进到O(V*∑log n[i])的过程,还知道了存在应用超出NOIP范围的知识的O(VN)算法。希望你特别注意“拆分物品”的思想和方法,自己证明一下它的正确性,并将完整的程序代码写出来。P04: 混合三种背包问题问题如果将P01、P02、P03混合起来。也就是说,有的物品只可以取一次(01背包),有的物品可以取无限次(完全背包),有的物品可以取的次数有一个上限(多重背包)。应该怎么求解呢?01背包与完全背包的混合考虑到在P01和P02中给出的伪代码只有一处不同,故如果只有两类物品:一类物品只能取一次,另一类物品可以取无限次,那么只需在对每个物品应用转移方程时,根据物品的类别选用顺序或逆序的循环即可,复杂度是O(VN)。伪代码如下:for i=1..N if 第i件物品属于01背包 for v=V..0 f[v]=max{f[v],f[v-c[i]]+w[i]}; else if 第i件物品属于完全背包 for v=0..V f[v]=max{f[v],f[v-c[i]]+w[i]};再加上多重背包如果再加上有的物品最多可以取有限次,那么原则上也可以给出O(VN)的解法:遇到多重背包类型的物品用单调队列解即可。但如果不考虑超过NOIP范围的算法的话,用P03中将每个这类物品分成O(log n[i])个01背包的物品的方法也已经很优了。当然,更清晰的写法是调用我们前面给出的三个相关过程。for i=1..N if 第i件物品属于01背包 ZeroOnePack(c[i],w[i]) else if 第i件物品属于完全背包 CompletePack(c[i],w[i]) else if 第i件物品属于多重背包 MultiplePack(c[i],w[i],n[i])在最初写出这三个过程的时候,可能完全没有想到它们会在这里混合应用。我想这体现了编程中抽象的威力。如果你一直就是以这种“抽象出过程”的方式写每一类背包问题的,也非常清楚它们的实现中细微的不同,那么在遇到混合三种背包问题的题目时,一定能很快想到上面简洁的解法,对吗?小结有人说,困难的题目都是由简单的题目叠加而来的。这句话是否公理暂且存之不论,但它在本讲中已经得到了充分的体现。本来01背包、完全背包、多重背包都不是什么难题,但将它们简单地组合起来以后就得到了这样一道一定能吓倒不少人的题目。但只要基础扎实,领会三种基本背包问题的思想,就可以做到把困难的题目拆分成简单的题目来解决。P07: 有依赖的背包问题简化的问题这种背包问题的物品间存在某种“依赖”的关系。也就是说,i依赖于j,表示若选物品i,则必须选物品j。为了简化起见,我们先设没有某个物品既依赖于别的物品,又被别的物品所依赖;另外,没有某件物品同时依赖多件物品。算法这个问题由NOIP2006金明的预算方案一题扩展而来。遵从该题的提法,将不依赖于别的物品的物品称为“主件”,依赖于某主件的物品称为“附件”。由这个问题的简化条件可知所有的物品由若干主件和依赖于每个主件的一个附件集合组成。按照背包问题的一般思路,仅考虑一个主件和它的附件集合。可是,可用的策略非常多,包括:一个也不选,仅选择主件,选择主件后再选择一个附件,选择主件后再选择两个附件……无法用状态转移方程来表示如此多的策略。(事实上,设有n个附件,则策略有2^n+1个,为指数级。)考虑到所有这些策略都是互斥的(也就是说,你只能选择一种策略),所以一个主件和它的附件集合实际上对应于P06中的一个物品组,每个选择了主件又选择了若干个附件的策略对应于这个物品组中的一个物品,其费用和价值都是这个策略中的物品的值的和。但仅仅是这一步转化并不能给出一个好的算法,因为物品组中的物品还是像原问题的策略一样多。再考虑P06中的一句话: 可以对每组中的物品应用P02中“一个简单有效的优化”。 这提示我们,对于一个物品组中的物品,所有费用相同的物品只留一个价值最大的,不影响结果。所以,我们可以对主件i的“附件集合”先进行一次01背包,得到费用依次为0..V-c[i]所有这些值时相应的最大价值f"[0..V-c[i]]。那么这个主件及它的附件集合相当于V-c[i]+1个物品的物品组,其中费用为c[i]+k的物品的价值为f"[k]+w[i]。也就是说原来指数级的策略中有很多策略都是冗余的,通过一次01背包后,将主件i转化为V-c[i]+1个物品的物品组,就可以直接应用P06的算法解决问题了。较一般的问题更一般的问题是:依赖关系以图论中“森林”的形式给出(森林即多叉树的集合),也就是说,主件的附件仍然可以具有自己的附件集合,限制只是每个物品最多只依赖于一个物品(只有一个主件)且不出现循环依赖。解决这个问题仍然可以用将每个主件及其附件集合转化为物品组的方式。唯一不同的是,由于附件可能还有附件,就不能将每个附件都看作一个一般的01背包中的物品了。若这个附件也有附件集合,则它必定要被先转化为物品组,然后用分组的背包问题解出主件及其附件集合所对应的附件组中各个费用的附件所对应的价值。事实上,这是一种树形DP,其特点是每个父节点都需要对它的各个儿子的属性进行一次DP以求得自己的相关属性。这已经触及到了“泛化物品”的思想。看完P08后,你会发现这个“依赖关系树”每一个子树都等价于一件泛化物品,求某节点为根的子树对应的泛化物品相当于求其所有儿子的对应的泛化物品之和。小结NOIP2006的那道背包问题我做得很失败,写了上百行的代码,却一分未得。后来我通过思考发现通过引入“物品组”和“依赖”的概念可以加深对这题的理解,还可以解决它的推广问题。用物品组的思想考虑那题中极其特殊的依赖关系:物品不能既作主件又作附件,每个主件最多有两个附件,可以发现一个主件和它的两个附件等价于一个由四个物品组成的物品组,这便揭示了问题的某种本质。我想说:失败不是什么丢人的事情,从失败中全无收获才是。P08: 泛化物品定义考虑这样一种物品,它并没有固定的费用和价值,而是它的价值随着你分配给它的费用而变化。这就是泛化物品的概念。更严格的定义之。在背包容量为V的背包问题中,泛化物品是一个定义域为0..V中的整数的函数h,当分配给它的费用为v时,能得到的价值就是h(v)。这个定义有一点点抽象,另一种理解是一个泛化物品就是一个数组h[0..V],给它费用v,可得到价值h[V]。一个费用为c价值为w的物品,如果它是01背包中的物品,那么把它看成泛化物品,它就是除了h(c)=w其它函数值都为0的一个函数。如果它是完全背包中的物品,那么它可以看成这样一个函数,仅当v被c整除时有h(v)=v/c*w,其它函数值均为0。如果它是多重背包中重复次数最多为n的物品,那么它对应的泛化物品的函数有h(v)=v/c*w仅当v被c整除且v/c<=n,其它情况函数值均为0。一个物品组可以看作一个泛化物品h。对于一个0..V中的v,若物品组中不存在费用为v的的物品,则h(v)=0,否则h(v)为所有费用为v的物品的最大价值。P07中每个主件及其附件集合等价于一个物品组,自然也可看作一个泛化物品。泛化物品的和如果面对两个泛化物品h和l,要用给定的费用从这两个泛化物品中得到最大的价值,怎么求呢?事实上,对于一个给定的费用v,只需枚举将这个费用如何分配给两个泛化物品就可以了。同样的,对于0..V的每一个整数v,可以求得费用v分配到h和l中的最大价值f(v)。也即f(v)=max{h(k)+l(v-k)|0<=k<=v}可以看到,f也是一个由泛化物品h和l决定的定义域为0..V的函数,也就是说,f是一个由泛化物品h和l决定的泛化物品。由此可以定义泛化物品的和:h、l都是泛化物品,若泛化物品f满足以上关系式,则称f是h与l的和。这个运算的时间复杂度取决于背包的容量,是O(V^2)。泛化物品的定义表明:在一个背包问题中,若将两个泛化物品代以它们的和,不影响问题的答案。事实上,对于其中的物品都是泛化物品的背包问题,求它的答案的过程也就是求所有这些泛化物品之和的过程。设此和为s,则答案就是s[0..V]中的最大值。背包问题的泛化物品一个背包问题中,可能会给出很多条件,包括每种物品的费用、价值等属性,物品之间的分组、依赖等关系等。但肯定能将问题对应于某个泛化物品。也就是说,给定了所有条件以后,就可以对每个非负整数v求得:若背包容量为v,将物品装入背包可得到的最大价值是多少,这可以认为是定义在非负整数集上的一件泛化物品。这个泛化物品——或者说问题所对应的一个定义域为非负整数的函数——包含了关于问题本身的高度浓缩的信息。一般而言,求得这个泛化物品的一个子域(例如0..V)的值之后,就可以根据这个函数的取值得到背包问题的最终答案。综上所述,一般而言,求解背包问题,即求解这个问题所对应的一个函数,即该问题的泛化物品。而求解某个泛化物品的一种方法就是将它表示为若干泛化物品的和然后求之。小结本讲可以说都是我自己的原创思想。具体来说,是我在学习函数式编程的 Scheme 语言时,用函数编程的眼光审视各类背包问题得出的理论。这一讲真的很抽象,也许在“模型的抽象程度”这一方面已经超出了NOIP的要求,所以暂且看不懂也没关系。相信随着你的OI之路逐渐延伸,有一天你会理解的。我想说:“思考”是一个OIer最重要的品质。简单的问题,深入思考以后,也能发现更多。2023-07-09 17:40:056