- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
NOIP2016普及组复赛题解
NOIP2016普及组C++
借鉴百度文库PASCAL版本:
/view/9aafb5f30342a8956bec0975f46527d3240ca6dc.html
第1题 “买铅笔”简述
P老师需要去商店买n支铅笔作为小朋友们参加NOIP的礼物。她发现商店一共有 3种包装的铅笔,不同包装内的铅笔数量有可能不同,价格也有可能不同。为了公平起 见,P老师决定只买同一种包装的铅笔。
商店不允许将铅笔的包装拆开,因此P老师可能需要购买超过n支铅笔才够给小朋 友们发礼物。
现在P老师想知道,在商店每种包装的数量都足够的情况下,要买够至少n支铅笔最少需要花费多少钱?
【分析】送分题,数据量少,直接模拟即可。
当然,“小心撑得万年船”,“大意失荆州”
例程 C++
#includeiostream
using namespace std;
int main()
{
long n,i,s,mins=100000000;
//n铅笔数量,i循环变量,s费用,mins最小费用
long c[4],p[4];//三种铅笔的数量和价格
cinn;
for (i=1;i4;i++)
{
cinc[i]p[i];
if(n%c[i]==0) s=n/c[i]*p[i];//正好整包
else s=(n/c[i]+1)*p[i];//有多余,再来一包
if(minss) mins=s;//判断那种买法最省钱
}
coutmins;
return 0;
}
第2题 “回文日期”简述
牛牛习惯用8位数字表示一个日期,其中,前4位代表年份,接下来2位代表月 份,最后2位代表日期。显然:一个日期只有一种表示方法,而两个不同的日期的表 示方法不会相同。
牛牛认为,一个日期是回文的,当且仅当表示这个日期的8位数字是回文的。现在,牛牛想知道:在他指定的两个日期之间(包含这两个日期本身),有多少个真实存在的日期是回文的。
一个8位数字是回文的,当且仅当从左向右读和从右向左是相同的
例如:
2016年11月19日,表示它不是回文的
2010年1月2日,表示它是回文的。
求:在他指定的两个日期之间包含这两个日期本身),有多少个真实存在的日期是回文的。
确定解题思路
一年是365天,如果闰年是366天。月日构成的数字最多只有366个。
第一步:构造出所有的日期(后四位)
第二步:利用回文的规则,构造出相应的年份
第三步:判断这个年份和日期在不在区间内
例如:8月15日,日期写成0815
对应回文的年份是:5180年
判一天在不在(指定的起始日期)到(指定的终止日期)之间
程序时间复杂度为O(366)
主程序
#includeiostream
using namespace std;
int main()
{
long i,j,y,m,d,t,date1,date2,sum=0;
//i,j循环变量,y对应日期,m月倒置的数值,d日倒置的数值
long ms[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
cindate1date2;//输入起始结束日期
for (i=1;i=12;i++)
{
m=i%10*10+i/10;//1-12月份倒置之后的值
t=ms[i];
for (j=1;j=t;j++)
主程序
d=j%10*10+j/10;//1-t日倒置之后的值
y=(d*100+m)*10000+i*100+j;//对应回文的日期
if(y=date1y=date2)
sum++;//判断这个日期在不在查询范围内
}
}
coutsumendl;
return 0;
}
确定解题思路(解法2)
如果从日期入手,一天一天往上加,每一天都要判断是不是合法的日期,是不是回文。容易出错,遇到极限数据还会超时
题目里还有更重要的一点是“回文”
位数是确定的,八位,很容易“组合”
例如:2014,可以组成我们只要判不是合法的日期就可以了
就算年份的范围是 1000~9999,也只要计算9000次就可以了
程序框架
输入数据
for i=day_start div 10000 // 取年份
=day_end div 10000 //循环起始到结束年份
if (check(i)) // 判断i年对应的日期是否符合要求
特别注意:还要判断这个日期是否在范围内
第3题 “海港”简述
小K按照时间记录下了到达海港的每一艘船只情况;对于第i艘到达的
您可能关注的文档
最近下载
- 2024年山东省职业技能等级认定试卷 真题 家庭照护员 高级6卷评分记录表 .pdf VIP
- 新人教选择性必修一 UNIT 3:Discover useful structures.pptx VIP
- 九年级英语上册外研社版:Module 3Unit 1-教学设计.docx
- 生产异丙醇化工设计答辩.pptx VIP
- IbaAnalyzer中文版用户手册.pdf VIP
- 妇幼保健院“四大业务部”服务流程.docx VIP
- 国家电网有限公司输变电工程质量通病防治手册(2019年版)2.pdf
- 《下肢静脉曲张疾病解析》课件.ppt VIP
- 运动解剖学(李世昌)躯干骨连接.ppt VIP
- 高一鲁科版化学必修一知识点总结.pdf VIP
文档评论(0)