ImageVerifierCode 换一换
格式:DOCX , 页数:9 ,大小:24.11KB ,
资源ID:22111281      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/22111281.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(noip提高组复赛解题报告文档格式.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

noip提高组复赛解题报告文档格式.docx

1、7;3、7=11;3、11=19;3、13=23得:3、n=2n-3设:其中一个数为5则:5、7=23;5、11=39;5、13=47;5、17=63得:5、n=4n-5所以:m、n=(m-1)n-m #includeusing namespace std;int main() long long a,m,n; scanf(%lld %lld,&m,&n); a=(m-1)*n-m; printf(%lld,a); return 0; 2.时间复杂度 (complexity.cpp/c/pas)【问题描述】小明正在学习一种新的编程语言 A+,刚学会循环语句的他激动地写了好多程序并给出了他自己算

2、出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序,于是你的机会来啦!下面请你编写程序来判断小明对他的每个程序给出的时间复杂度是否正确。A+语言的循环结构如下:其中“F i x y”表示新建变量 (i 变量 i 不可与未被销毁的变量重名)并初始化为 x,然后判断 i 和 y 的大小关系,若 i 小于等于 y 则进入循环,否则不进入。每次循环结束后i都会被修改成i +1,一旦i 大于 y 终止循环。x和 y 可以是正整数(x 和 y 的大小关系不定)或变量 n。n 是一个表示数据规模的变量,在时间复杂度计算中需保留该变量而不能将其视为常数,该数远大于 100。“E”表示循环体结束。循环

3、体结束时,这个循环体新建的变量也被销毁。注:本题中为了书写方便,在描述复杂度时,使用大写英文字母“O”表示通常意义下“”的概念。【输入格式】输入文件名为 complexity.in。输入文件第一行一个正整数 t,表示有 t(t 10)个程序需要计算时间复杂度。每个程序我们只需抽取其中 “F i x y”和“E”即可计算时间复杂度。循环结构允许嵌套。接下来每个程序的第一行包含一个正整数 L 和一个字符串,L 代表程序行数,字符串表示这个程序的复杂度,“O(1)”表示常数复杂度,“O(nw)”表示复杂度为nw,其中 w 是一个小于 100 的正整数(输入中不包含引号),输入保证复杂度只有 O(1)

4、和 O(nw) 两种类型。接下来 L 行代表程序中循环结构中的“F i x y”或者 “E”。程序行若以“F”开头,表示进入一个循环,之后有空格分离的三个字符(串)i x y,其中 i 是一个小写字母(保证不为“n”),表示新建的变量名,x 和 y 可能是正整数或 n ,已知若为正整数则一定小于 100。程序行若以“E”开头,则表示循环体结束。【输出格式】输出文件名为 complexity.out。输出文件共 t 行,对应输入的 t 个程序,每行输出“Yes”或“No”或者“ERR”(输出中不包含引号),若程序实际复杂度与输入给出的复杂度一致则输出“Yes”,不一致则输出“No”,若程序有语法

5、错误(其中语法错误只有: F 和E 不匹配;新建的变量与已经存在但未被销毁的变量重复两种情况),则输出“ERR”。即使在程序不会执行的循环体中出现了语法错误也会编译错误,要输出 “ERR”。 【输入输出样例 1】complexity.in82 O(1)F i 1 1E2 O(n1)F x 1 nE1 O(1)F x 1 n4 O(n2)F x 5 nF y 10 nEE4 O(n2)F x 9 nEF y 2 nE4 O(n1)F x 9 nF y n 4EE4 O(1)F y n 4F x 9 nEE4 O(n2)F x 1 nF x 1 10EEcomplexity.outYesYesER

6、RYesNoYesYesERR【数据规模与约定】对于 30%的数据:不存在语法错误,数据保证小明给出的每个程序的前 L/2 行一定为以 F 开头的语句,第L/2+1 行至第 L 行一定为以 E 开头的语句,L,若 x、y 均为整数,x 一定小于 y,且只有 y 有可能为n。对于50%的数据:不存在语法错误,L,且若x、y均为整数,x 一定小于 y,且只有 y 有可能为 n。对于 70%的数据:不存在语法错误,L。L。 用STL stack模拟,对于用代码量堆出来的OIer来说,这就是信心倍增的大力模拟题。 代码就不上了。 3. 逛公园(park.cpp/c/pas)【问题描述】策策同学特别喜欢

7、逛公园。公园可以看成一张N个点M条边构成的有向图,且没有自环和重边。其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值,代表策策经过这条边所要花的时间。策策每天都会去逛公园,他总是从1号点进去,从N号点出来。策策喜欢新鲜的事物,他不希望有两天逛公园的路线完全一样,同时策策还是一个特别热爱学习的好孩子,他不希望每天在逛公园这件事上花费太多的时间。如果1号点到N号点的最短路长为d,那么策策只会喜欢长度不超过d+K的路线。策策同学想知道总共有多少条满足条件的路线,你能帮帮他吗?为避免输出过大,答案对P取模。如果有无穷多条合法的路线,请输出?1。【输入格式】输入文件名为 park.in。

8、第一行包含一个整数T, 代表数据组数。接下来T组数据,对于每组数据:第一行包含四个整数N, M, K, P,每两个整数之间用一个空格隔开。接下来M行,每行三个整数ai , bi , ci,代表编号为ai, bi的点之间有一条权值为ci的有向边,每两个整数之间用一个空格隔开。【输出格式】输出文件名为 park.out。输出文件包含T行,每行一个整数代表答案。【输入输出样例 1】park.in25 7 2 101 2 12 4 04 5 22 3 23 4 13 5 21 5 32 2 0 101 2 02 1 0park.out3-1【数据规模与约定】对于不同的测试点,我们约定各种参数的规模不会

9、超过如下:对于100%的数据, 1P109,1ai,bi?,0ci 1000。数据保证:至少存在一条合法的路线。 最短路+拓扑排序+DP先跑最短路。发现K只有50,所以一定是要从K入手。所以考虑DP,令fij表示走到i,多走的长度是j的方案数。(多走指的是比最短路多的部分的长度)。但是发现这个DP方程是存在环的,因为最短路径图上的边以及零边都是可以同行转移的。将最短路径图上的边以及零边都拿出来跑拓扑排序,然后让这些边在转移时必须沿着拓扑序转移即可。特别地,如果一个零环位于一条从1到n长度的路径上,则输出-1即可。 #include#include#include#include#include

10、#include#define mp(A,B) make_pair(A,B)using namespace std;const int maxn=100010;const int maxm=200010;int n,m,cnt,K,P,tot,ans;int tomaxm,nextmaxm,valmaxm,headmaxn,dismaxn,vismaxn,dmaxn,qmaxnint to2maxm,next2maxm,val2maxm,head2maxn,dis2maxn;priority_queue pq;inline int rd() int ret=0; char gc=getchar

11、(); while(gc9) gc=getchar(); while(gc=0&gc return ret;inline void add(int a,int b,int c) tocnt=b,valcnt=c,nextcnt=heada,heada=cnt; to2cnt=a,val2cnt=c,next2cnt=head2b,head2b=cnt+;inline void upd(int &x,int y) x=(x+y)%P;void work() n=rd(),m=rd(),K=rd(),P=rd(); int i,j,k,a,b,c,u; memset(head,-1,sizeof(

12、head),memset(head2,-1,sizeof(head2),cnt=tot=ans=0; for(i=1;i /1 memset(vis,0,sizeof(vis),memset(dis,0x3f,sizeof(dis),memset(d,0,sizeof(d); pq.push(mp(0,1),dis1=0; while(!pq.empty() u=pq.top().second,pq.pop(); if(visu) continue; visu=1; for(i=headu;i!=-1;i=nexti) if(distoidisu+vali)distoi=disu+vali,p

13、q.push(mp(-distoi,toi); /2 memset(dis2,0x3f,sizeof(dis2),memset(vis,0,sizeof(vis); pq.push(mp(0,n),dis2n=0; for(i=head2u;i=next2i) if(dis2to2idis2u+val2i)dis2to2i=dis2u+val2i,pq.push(mp(-dis2to2i,to2i); /3 for(i=1;i for(i=1;i for(j=1;j u=qj;i=nexti) if(disu+vali=distoi) dtoi-; if(!dtoi) q+tot=toi; f

14、or(i=1;i printf(-1n); return ; /DP memset(f,0,sizeof(f); f01=1; for(k=0;k for(i=1;i upd(fktoj,fku); for(i=1;i upd(fk+disi+valj-distojtoj,fki); for(i=0;i printf(%dn,ans);int main() int T=rd(); while(T-) work(); Day2 1.奶酪 (cheese.cpp/c/pas)【问题描述】现有一块大奶酪,它的高度为 h,它的长度和宽度我们可以认为是无限大的,奶酪中间有许多半径相同的球形空洞。我们可以

15、在这块奶酪中建立空间坐标系,在坐标系中,奶酪的下表面为z = 0,奶酪的上表面为z = h。现在,奶酪的下表面有一只小老鼠 Jerry,它知道奶酪中所有空洞的球心所在的坐标。如果两个空洞相切或是相交,则 Jerry 可以从其中一个空洞跑到另一个空洞,特别地,如果一个空洞与下表面相切或是相交,Jerry则可以从奶酪下表面跑进空洞;如果一个空洞与上表面相切或是相交,Jerry 则可以从空洞跑到奶酪上表面。位于奶酪下表面的 Jerry 想知道,在不破坏奶酪的情况下,能否利用已有的空洞跑到奶酪的上表面去?空间内两点P(x ,y ,z )、P(x ,y ,z )的距离公式如下:【输入格式】输入文件名为

16、cheese.in。每个输入文件包含多组数据。输入文件的第一行,包含一个正整数 T,代表该输入文件中所含的数据组数。接下来是 T 组数据,每组数据的格式如下:第一行包含三个正整数 n,h 和 r,两个数之间以一个空格分开,分别代表奶酪中空洞的数量,奶酪的高度和空洞的半径。接下来的 n 行,每行包含三个整数 x、y、z,两个数之间以一个空格分开,表示空洞球心坐标为(x, y, z)。【输出格式】输出文件名为 cheese.out。输出文件包含 T 行,分别对应 T 组数据的答案,如果在第 i 组数据中,Jerry 能从下表面跑到上表面,则输出“Yes”,如果不能,则输出“No”(均不包含引号)。

17、【输入输出样例 1】 cheese.in32 4 10 0 10 0 32 5 10 0 10 0 42 5 20 0 22 0 4cheese.outYesNoYes【数据规模与约定】对于 20%的数据,n = 1,1 h , r 10,000,坐标的绝对值不超过 10,000。对于 40%的数据,1 n 8, 1 h , r 10,000,坐标的绝对值不超过 10,000。对于 80%的数据,1 n 1,000,1 h , r 10,000,坐标的绝对值不超过 10,000。对于 100%的数据,1 n 1,000,1 h , r 1,000,000,000,T 20,坐标的绝对值不超过

18、1,000,000,000。真正的T1,并查集+高二数学常识。用并查集做,将位置相距小于等于2倍半径的归为一个集合。注意:Z位置+半径=H的,与1001归为一个集合。Z位置-半径的,与0归为一个集合。最后看0和1001是否在一个集合中。#include#include#include#include#include#include#include#includeusing namespace std;int t,n,h,r,x,y,z,f,fa1002,t1,t2;struct sb int x; int y; int z;a1001;intfind(int k) if(fak!=k) fak

19、=find(fak); return fak;int main() cint; for(int i=1;i cinnhr;i fai=i; fa0=0; fa1001=1001; for(int j=1;j cinaj.xaj.yaj.z; if(aj.z+r=h) t1=find(j); t2=find(1001); fat1=t2; if(aj.z-r t1=find(j); t2=find(0); for(int w=1;w if(sqrt(aj.x-aw.x)*(aj.x-aw.x)+(aj.y-aw.y)*(aj.y-aw.y)+(aj.z-aw.z)*(aj.z-aw.z) t1=

20、find(j); t2=find(w); t1=find(0); if(t1=t2) cout else cout return 0; 2. 宝藏 (treasure.cpp/c/pas)【问题描述】参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋,也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的长度。小明决心亲自前往挖掘所有宝藏屋中的宝藏。但是,每个宝藏屋距离地面都很远,也就是说,从地面打通一条到某个宝藏屋的道路是很困难的,而开发宝藏屋之间的道路则相对容易很多。小明的决心感动了考古挖掘的赞助商,赞助商决定免费赞助他打通一条从地面到某个宝藏屋的通道,通往哪

21、个宝藏屋则由小明来决定。在此基础上,小明还需要考虑如何开凿宝藏屋之间的道路。已经开凿出的道路可以任意通行不消耗代价。每开凿出一条新道路,小明就会与考古队一起挖掘出由该条道路所能到达的宝藏屋的宝藏。另外,小明不想开发无用道路,即两个已经被挖掘过的宝藏屋之间的道路无需再开发。新开发一条道路的代价是:这条道路的长度 从赞助商帮你打通的宝藏屋到这条道路起点的宝藏屋所经过的宝藏屋的数量(包括赞助商帮你打通的宝藏屋和这条道路起点的宝藏屋)。请你编写程序为小明选定由赞助商打通的宝藏屋和之后开凿的道路,使得工程总代价最小,并输出这个最小值。【输入格式】输入文件名为 treasure.in。第一行两个用空格分离

22、的正整数 n 和 m,代表宝藏屋的个数和道路数。接下来 m 行,每行三个用空格分离的正整数,分别是由一条道路连接的两个宝藏屋的编号(编号为 1n),和这条道路的长度 v。【输出格式】输出文件名为 treasure.out。输出共一行,一个正整数,表示最小的总代价。【输入输出样例 1】treasure.in4 51 2 11 3 31 4 12 3 43 4 1treasure.out4【样例输入输出 2】treasure.in4 51 2 11 3 31 4 12 3 43 4 2treasure.out5【数据规模与约定】对于 20%的数据:保证输入是一棵树,1n8,v5000 且所有的 v

23、 都相等。对于 40%的数据:1n8,0m1000,v5000 且所有的 v 都相等。1n8,0m1000,v 5000对于 100%的数据:1n12,0m1000,v 500000状压DP一看n,明显是状压DP的数据范围。于是令fiS表示当前与根连通的点的状态为S,并且最深的点的深度为i的最小代价。转移时,我们枚举所有不在S中的点,处理出每个点与S中的某个点连通所需要的最小代价。然后枚举这些点构成的所有集合S,用S中所有点的代价+fiS去更新fi+1S|S即可。时间复杂度:O(n3n)。 #include#include#includeusing namespace std;typedef

24、long long ll;int n,m,tot,ans; int map110110,dis110110,Log4100;int f154100,g4100,ref4100,v15,p15;inline int min(const int &a,const int &b) return a int main() scanf(%d%dn,&m); register int i,j,a,b,c,x; for(i=0;i scanf(%d%d%da,&b,&c),a-,b-; mapab=mapba=min(mapab,c); for(i=0;i memset(f,0x3f,sizeof(f);i

25、 for(i=0;i tot=0; for(a=0;a vtot=60000000,ptot=1 for(j=x;j;j-=j&-j) b=Logj&-j; vtot=min(vtot,mapab*(i+1); tot+; for(j=1;j gj=gj-(j&-j)+vLogj&-j; refj=refj-(j&-j)|pLogj& fi+1x|refj=min(fi+1x|refj,fix+gj); ans=1 for(i=0;%d 3.列队 (phalanx.cpp/c/pas)【问题描述】Sylvia是一个热爱学习的女孩子。前段时间,Sylvia 参加了学校的军训。众所周知,军训的时候

26、需要站方阵。Sylvia 所在的方阵中有n m名学生,方阵的行数为 n,列数为 m。为了便于管理,教官在训练开始时,按照从前到后,从左到右的顺序给方阵中的学生从 1 到 n m 编上了号码(参见后面的样例)。即:初始时,第 i 行第 j 列的学生的编号是(i?1)m+j。然而在练习方阵的时候,经常会有学生因为各种各样的事情需要离队。在一天中,一共发生了q件这样的离队事件。每一次离队事件可以用数对(x,y) (1xn, 1ym)描述,表示第 x 行第 y 列的学生离队。在有学生离队后,队伍中出现了一个空位。为了队伍的整齐,教官会依次下达这样的两条指令:1.向左看齐。这时第一列保持不动,所有学生向

27、左填补空缺。不难发现在这条指令之后,空位在第 x 行第 m列。2.向前看齐。这时第一行保持不动,所有学生向前填补空缺。不难发现在这条指令之后,空位在第 n 行第 m列。教官规定不能有两个或更多学生同时离队。即在前一个离队的学生归队之后,下一个学生才能离队。因此在每一个离队的学生要归队时,队伍中有且仅有第 n 行第 m 列一个空位,这时这个学生会自然地填补到这个位置。因为站方阵真的很无聊,所以 Sylvia 想要计算每一次离队事件中,离队的同学的编号是多少。每一个同学的编号不会随着离队事件的发生而改变,在发生离队事件后方阵中同学的编号可能是乱序的。【输入格式】输入文件名为 phalanx.in。

28、输入共 q+1 行。第 1 行包含 3 个用空格分隔的正整数 n, m, q,表示方阵大小是n行 m 列,一共发生了 q 次事件。接下来 q 行按照事件发生顺序描述了 q 件事件。每一行是两个整数 x, y,用一个空格分隔,表示这个离队事件中离队的学生当时排在第 x 行第 y 列。【输出格式】输出文件名为 phalanx.out。按照事件输入的顺序,每一个事件输出一行一个整数,表示这个离队事件中离队学生的编号。【输入输出样例 1】phalanx.in2 2 31 12 21 2phalanx.out114【数据规模与约定】数据保证每一个事件满足 1xn,1ym。 离线+平衡树由于操作是可逆的,所以将所有操作反过来做,将人的移动改成询问的反向移动,那么只需要维护这些询问点的移动即可,不难想到用数据结构。将操作顺序反过来,那么一次操作(x,y)可以看成:1.(n,m)的学生出队;2.第n列中,第x行及以下的所有学生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1