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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

noip提高组解题报告C语言.docx

1、noip提高组解题报告C语言1. 潜伏者(spy.pas/c/cpp)【问题描述】R国和S国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动。历经艰险后,潜伏于S国的R国间谍小C终于摸清了S国军用密码的编码规则:1、 S国军方内部欲发送的原信息经过加密后在网络上发送,原信息的内容与加密后所的内容均由大写字母AZ构成(无空格等其他字母)。2、 S国对于每个字母规定了对应的“密字”。加密的过程就是将原信息中的所有字母替换为其对应的“密字”。3、 每个字母只对应一个唯一的“密字”,不同的字母对应不同的“密字”。“密字”可以和原字母相同。例如,若规定A的密字为A,B的密字为C(其他字母及密字略)

2、,则原信息“ABA”被加密为“ACA”。现在,小C通过内线掌握了S国网络上发送的一条加密信息及其对应的原信息。小C希望能通过这条信息,破译S国的军用密码。小C的破译过程是这样的:扫描原信息,对于原信息中的字母x(代表任一大写字母),找到其在加密信息中的对应大写字母y,并认为在密码里y是x的密字。如此进行下去直到停止于如下的某个状态:1、 所有信息扫描完毕,AZ所有26个字母在原信息中均出现过并获得了相应的“密字”。2、 所有信息扫描完毕,但发现存在某个(或某些)字母在原信息中没有出现。3、 扫描中发现掌握的信息里有明显的自相矛盾或错误(违反S过密码的编码规则)。例如某条信息“XYZ”被翻译为“

3、ABA”就违反了“不同字母对应不同密字”的规则。在小C忙得头昏脑胀之际,R国司令部又发来电报,要求他翻译另外一条从S国刚刚截取到的加密信息。现在请你帮助小C:通过内线掌握的信息,尝试破译密码。然后利用破译的密码,翻译电报中的加密信息。【输入】输入文件名为spy.in,共3行,每行为一个长度在1到100之间的字符串。第1行为小C掌握的一条加密信息。第2行为第1行的加密信息所对应的原信息。第3行为R国司令部要求小C翻译的加密信息。输入数据保证所有字符串仅由大写字母AZ构成,且第1行长度与第2行相等。【输出】输出文件spy.out共1行。若破译密码停止时出现2,3两种情况,请你输出“Failed”(

4、不含引号,注意首字母大写,其它小写)。否则请输出利用密码翻译电报中加密信息后得到的原信息。【输入输出样例1】spy.inspy.outAAABEOWIEFailed【输入输出样例1说明】原信息中的字母A和B对应相同的密字,输出“Failed”。【输入输出样例2】spy.inspy.outQWERTYUIOPLKJHGFDSAZXCVBNABCDEFGHIJKLMNOPQRSTUVWXYDSLIEWOFailed【输入输出样例2说明】字母Z在原信息中没有出现,输出“Failed”。【输入输出样例3】spy.inspy.outMSRTZCJKPFLQYVAWBINXUEDGHOOILSMIJFRC

5、OPPQCEUNYDUMPPYIZSDWAHLNOVFUCERKJXQMGTBPPKOIYKANZWPLLVWMQJFGQYLLFLSONOIP【分析】注意每个限定条件就好了,小借哈希表存储,仅测试样例且通过。【程序】#include#includestring.hchar str101;main() void deciphering(char str1,char str2); void trans(char dic); FILE *in; int i; char str1101,str2101,str3101; in=fopen(spy.in,r); fscanf(in,%s%s%s,str

6、1,str2,str); fclose(in); deciphering(str1,str2); void deciphering(char str1,char str2) char temp126=,temp226=; FILE *out; int n,ch,i; n=strlen(str1); for(i=0;in;i+) ch=str1i-65; if(temp1ch=0) temp1ch=str2i; if(str2i!=temp1ch)break; ch=str2i-65; if(temp2ch=0) temp2ch=str1i; if(str1i!=temp2ch)break; f

7、or(ch=0;ch26;ch+) if(temp1ch);else i=0;break;/如果有字母未被翻译 if(i=n) trans(temp1); else out=fopen(spy.out,w); fprintf(out,Failed); fclose(out); void trans(char dic) int i; char tr101=; FILE *out; for(i=0;istrlen(str);i+) tri=dicstri-A; out=fopen(spy.out,w); fprintf(out,%s,tr); fclose(out); 2. Hankson的趣味题

8、(son.pas/c/cpp)【问题描述】Hanks博士是BT(Bio-Tech,生物技术)领域的知名专家,他的儿子名叫Hankson。现在,刚刚放学回家的Hankson正在思考一个有趣的问题。今天在课堂上,老师讲解了如何求两个正整数c1和c2的最大公约数和最小公倍数。现在Hankson认为自己已经熟练地掌握了这些知识,他开始思考一个“求公约数”和“求公倍数”之类问题的“逆问题”,这个问题是这样的:已知正整数a0,a1,b0,b1,设某未知正整数x满足:1、 x和a0的最大公约数是a1;2、 x和b0的最小公倍数是b1。Hankson的“逆问题”就是求出满足条件的正整数x。但稍加思索之后,他发

9、现这样的x并不唯一,甚至可能不存在。因此他转而开始考虑如何求解满足条件的x的个数。请你帮助他编程求解这个问题。【输入】 输入文件名为son.in。第一行为一个正整数n,表示有n组输入数据。接下来的n行每行一组输入数据,为四个正整数a0,a1,b0,b1,每两个整数之间用一个空格隔开。输入数据保证a0能被a1整除,b1能被b0整除。【输出】输出文件son.out共n行。每组输入数据的输出结果占一行,为一个整数。对于每组数据:若不存在这样的x,请输出0;若存在这样的x,请输出满足条件的x的个数;【输出输出样例】son.inson.out241 1 96 28895 1 37 177662【说明】第

10、一组输入数据,x可以是9、18、36、72、144、288,共有6个。第二组输入数据,x可以是48、1776,共有2个。【数据范围】对于50%的数据,保证有1a0,b1,b0,b110000且n100。对于100%的数据,保证有1a0,b1,b0,b12,000,000,000且n2000。【分析】感觉我的方法很简洁,相比网上许多大神的算法。估计是哪里算错了推导过程:x为待求数,依题意,b1b0=a;b1x=b;a0a1=a;x/a1=b,可推出bb=b1a1;容易知道b与a最大公约数为1,b与a最大公约数也为1;x可能的个数等于满足以上条件的bb的对数。仅测试样例且通过。【程序】#inclu

11、demain() FILE *in,*out; int hankson(unsigned long arr4); int compare( unsigned long a,unsigned long b); int n,t; unsigned long arr4; in=fopen(son.in,r); out=fopen(son.out,w); fscanf(in,%d,&n); while(n-) fscanf(in,%d%d%d%d,arr,arr+1,arr+2,arr+3); t=hankson(arr); fprintf(out,%dn,t); fclose(in); fclose

12、(out); int hankson(unsigned long arr4) unsigned long a0=arr0,a1=arr1,b0=arr2,b1=arr3; unsigned long a,ap,b,bp,t; int i,s=0; a=b1/b0; ap=a0/a1; if(b1%a1!=0) return 0; else t=b1/a1; for(i=1;i2-3-5,并在2号城市以3的价格买入水晶球,在3号城市以5的价格卖出水晶球,赚取的旅费数为2。阿龙也可以选择如下一条线路:1-4-5-4-5,并在第1次到达5号城市时以1的价格买入水晶球,在第2次到达4号城市时以6的价格

13、卖出水晶球,赚取的旅费数为5。现在给出n个城市的水晶球价格,m条道路的信息(每条道路所连接的两个城市的编号以及该条道路的通行情况)。请你告诉阿龙,他最多能赚钱多少旅费。【输入】输入文件名为trade.in。第一行包含2个正整数n和m,中间用一个空格隔开,分别表示城市的数目和道路的数目。第二行n个正整数,每两个正整数之间用一个空格隔开,按标号顺序分别表示这n个城市的商品价格。接下来m行,每行有3个正整数,x,y,z,每两个整数之间用一个空格隔开。如果z=1,表示这条道路是城市x到城市y之间的单向道路;如果z=2,表示这条道路为城市x和城市y之间的双向道路。【输出】输出文件trade.out共1行

14、,包含1个整数,表示最多能赚取的旅费。如果没有进行贸易,则输出0。【输出输出样例】trade.intrade.out5 54 3 6 5 11 2 11 4 12 3 23 5 14 5 25【数据范围】输入数据保证1号城市可以到达n号城市。对于10%的数据,1n6。对于30%的数据,1n100。对于50%的数据,不存在一条旅游路线,可以从一个城市出发,再回到这个城市。对于100%的数据,1n100000,1m500000,1x,yn,1z2,1各城市水晶球价格100。【吐槽】图论很差,而且这道题的数据范围实在!#¥%,网上说民间做法是SPFA,不太懂,尝试做了一遍,转晕了,也找不到C语言写的

15、答案。网上C语言的答案太少了,似乎高中那些年学PASCAL的居多,我已然看不懂也懒得了。这道题,以后有时间再说。数据结构用起来挺生疏的。4. 靶形数独(sudoku.pas/c/cpp)【问题描述】小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低。但普通的数独对他们来说都过于简单了,于是他们向Z博士请教,Z博士拿出了他最近发明的“靶形数独”,作为这两个孩子比试的题目。靶形数独的方格同普通数独一样,在9格宽9格高的大九宫格中有9个3格宽3格高的小九宫格(用粗黑色线隔开的)。在这个大九宫格中,有一些数字是已知的,根据这些数字,利用逻辑推理,在其他的空

16、格上填入1到9的数字。每个数字在每个小九宫格内不能重复出现,每个数字在每行、每列也不能重复出现。但靶形数独有一点和普通数独不同,即每一个方格都有一个分值,而且如同一个靶子一样,离中心越近则分值越高。(如图略)上图具体的分值分布是:最里面一格(黄色区域)为10分,黄色区域外面的一圈(红色区域)每个格子为9分,再外面一圈(蓝色区域)每个格子为8分,蓝色区域外面一圈(棕色区域)每个格子为7分,最外面一圈(白色区域)每个格子为6分,如上图所示。比赛的要求是:每个人必须完成一个给定的数独(每个给定数独有可能有不同的填法),而且要争取更高的总分数。而这个总分数即每个方格上的分值和完成这个数独时填在相应格上

17、的数字的乘积的总和。如图,在以下这个已经填完数字的靶形数独游戏中,总分为2829。游戏规定,将以总分数的高低决出胜负。由于求胜心切,小城找到了善于编程的你,让你帮他求出,对于给定的靶形数独,能够得到的最高分数。【输入】输入文件名为sudoku.in。一共9行,每行9个整数(每个数都在09的范围内),表示一个尚未填满的数独方格,未填满的空格用“0”表示。每两个数字之间用一个空格隔开。【输出】输出文件sudoku.out共1行。输出可以得到的靶形数独的最高分数。如果这个数独无解,则输出整数-1。【输入输出样例1】sudoku.insudoku.out7 0 0 9 0 0 0 0 11 0 0 0

18、 0 5 9 0 00 0 0 2 0 0 0 8 00 0 5 0 2 0 0 0 30 0 0 0 0 0 6 4 84 1 3 0 0 0 0 0 00 0 7 0 0 2 0 9 02 0 1 0 6 0 8 0 40 8 0 5 0 4 0 1 22829【输入输出样例2】sudoku.insudoku.out0 0 0 7 0 2 4 5 39 0 0 0 0 8 0 0 07 4 0 0 0 5 0 1 01 9 5 0 8 0 0 0 00 7 0 0 0 0 0 2 50 3 0 5 7 9 1 0 80 0 0 6 0 1 0 0 00 6 0 9 0 0 0 0 10 0

19、 0 0 0 0 0 0 62852【数据范围】40%的数据,数独中非0数的个数不少于30。80%的数据,数独中非0数的个数不少于26。100%的数据,数独中非0数的个数不少于24。【分析】大家都说暴搜,暴搜最开心了。递归填入每一个可以填的空,填满一次计算一次,取最大分值。另外沿不同的方向搜通过的数据不等。仅测试样例且通过。【程序】#includeint array99,M=0;main() void sudoku(int arr,int a,int b); FILE *in,*out; int arr99,i,j; in=fopen(sudoku.in,r); for(i=0;i9;i+)

20、for(j=0;j9;j+) fscanf(in,%d,&arrij); arrayij=arrij; if(arrij=0) arrayij=10; sudoku(arr,0,0); out=fopen(sudoku.out,w); fprintf(out,%d,M); fclose(in); fclose(out); void sudoku(int arr9,int a,int b) int bl,s,i,j,t=0; if(a=9)s=0; for(i=0;i9;i+) for(j=0;j4?(t=i-4):(t=4-i); j4?(bl=j-4):(bl=4-j); if(tM) M=

21、s; else if(arrab!=arrayab) for(t=1;t=9;t+) bl=1; for(i=0;ia;i+) if(t=arrib) bl=0;break; if(bl) for(i=a+1;i9;i+) if(t=arrayib) bl=0;break; if(bl) for(i=0;ib;i+) if(t=arrai) bl=0;break; if(bl) for(i=b+1;i9;i+) if(t=arrayai) bl=0;break; if(bl) for(i=a/3*3;ia/3*3+3;i+) for(j=b/3*3;jb/3*3+3;j+) if(ia|(i=a&jb) if(arrij=t)bl=0;break; else if(t=arrayij)bl=0;break; if(bl) arrab=t; if(b8) sudoku(arr,a,b+1); else sudoku(arr,a+1,0); else if(b8) sudoku(arr,a,b+1); else sudoku(arr,a+1,0); 我比较新手,难免有许多不对的地方,有什么关键性错误希望提醒,邮箱285866979网上C语言答案很少,所以比较纠结,希望大神们多分享。

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

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