NOIP2014普与组复赛试题讲解(c++版本)

合集下载

NOIP2014初赛普及组C++题目及答案

NOIP2014初赛普及组C++题目及答案

NOIP2014初赛普及组C++题目及答案

第二十届全国青少年信息学奥林匹克联赛初赛

普及组C++语言试题2014年

一、快单项选择题(共20题,每题1.5分,共计30

分;每题有且仅有一个正确选项)

⒈以下哪个是面向对象的高级语言( )。

A.汇编语言

B.C++

C.Fortran

D.Basic

⒉1TB代表的字节数是( )。

A.2的10次方

B.2的20次方

C.2的30次方

D.2的40次方

⒊二进制数00100100和00010101的和是( )。

A.00101000

B.001010100

C.01000101

D.00111001

⒋以下哪一种设备属于输出设备( )。

A.扫描仪

B.键盘

C.鼠标

D.打印机

⒌下列对操作系统功能的描述最为完整的是( )。

A.负责外设与主机之间的信息交换

B.负责诊断机器的故障

C.控制和管理计算机系统的各种硬件和软件资源的使用

D.将没有程序编译成目标程序

⒍CPU、存储器、I/O设备是通过( )连接起来的。

A.接口

B.总线

C.控制线

D.系统文件

⒎断电后会丢失数据的存储器是( )。

A.RAM

B.ROM

C.硬盘

D.光盘

⒏以下哪一种是属于电子邮件收发的协议( )。

A.SMTP

B.UDP

C.P2P

D.FTP

⒐下列选项中不属于图像格式的是( )。

A.JPEG格式

B.TXT格式

C.GIF格式

D.PNG格式

⒑链表不具有的特点是( )。

A.不必事物估计存储空间

B.可随机访问任一元素

C.插入删除不需要移动元素

D.所需空间与线性表长度成正比

⒒下列各无符号十进制整数中,能用八位二进制表示的数中最大的是( )。

NOIP2014普及组初赛答案(C++)

NOIP2014普及组初赛答案(C++)

第二十届全国青少年信息学奥林匹克联赛初赛

普及组参考答案

一、单项选择题(共20 题,每题1.5 分,共计30 分)

二、问题求解(共2 题,每题5 分,共计10 分;每题全部答对得5 分,没有部分分)

1. 18

2. 11

三、阅读程序写结果(共4 题,每题8 分,共计32 分)

1. Ans = 9

2. -11

3. HELLO, MY NAME IS LOSTMONKEY.

4. 10

四、完善程序(共计28 分,以下各程序填空可能还有一些等价的写法,由各省赛区组织本省专家审定及上机验证,可以不上报CCF NOI 科学委员会复核)

2014noip复赛模拟练习31

2014noip复赛模拟练习31

1. 数字反转(reverse.pas)【问题描述】给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零。(参见样例2)

【输入】输入文件名为reverse.in。输入共一行,一个整数n。

【输出】输出文件名为reverse.out。

输出共一行,一个整数,表示反转后的新数。

【输入输出样例1】

reverse.in reverse.out

123 321

【输入输出样例2】

reverse.in reverse.out

-380 -83

【数据范围】 -1,000,000,000≤N≤1,000,000,000。

2. 查找“支撑数”【试题描述】在已知一组整数中,有这样一种数非常怪,它们不在第一个,也不在最后一个,而且刚好都比左边和右边相邻的数大,你能找到它们吗?每行输出5项。

【输入描述】

第一行为整数m,表示输入的整数个数。(3<= m <=100 )

第二行为m个整数。

【输出描述】

若干个支撑数

【输入样例】

14

1 3

2 4 1 5

3 9 7 10 8 23 85 43

【输出样例】

3 4 5 9 10

85

3. 编程即将上课,为了能让每个同学都能拿到教材,老师让star去发教材,由于star比较内向,见到不认识的新同学你会害羞得什么话也不和他说,什么事情也不对他做,当然更不可能发书给他了。怎么办呢?老师的任务不能不完成啊!当然,遇到star认识的同学star还是很乐意交流的,于是star会要求他认识的同学继续帮他发书(不管对方认不认识他),star害羞的情绪也影响了其他所有同学,于是其他同学也只会发书给他认识的人。最后star要统计还有哪些同学没有拿到书,他就只能硬着头皮,顶着极大地心理压力给他们发书(老师的任务一定要完成啊)所有的学生都用学号来表示。

NOIP普及组历届试题分析

NOIP普及组历届试题分析

方法2:参考代码
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
var i, n, a, b, ans:longint; vis:array[0..20005]of 0..2; f:array[0..105]of longint; begin readln(n); fillchar(vis,sizeof(vis),0); for i:=1 to n do begin read(f[i]); vis[f[i]]:=1; end; ans:=0; for a:=1 to n do for b:=1 to n do if (vis[f[a]+f[b]]=1)and(a<>b) then begin inc(ans); vis[f[a]+f[b]]:=2; end; writeln(ans); end.
比例简化 (noip2014普及组第二题)



在社交媒体上,经常会看到针对某一个观点同意与 否的民意调查以及结果。例如,对某 一观点表示 支持的有 1498 人,反对的有 902 人,那么赞同与 反对的比例可以简单的记为1498:902。 不过,如果把调查结果就以这种方式呈现出来,大 多数人肯定不会满意。因为这个比例的数值太大, 难以一眼看出它们的关系。对于上面这个例子,如 果把比例记为 5:3,虽然与 真实结果有一定的误差, 但依然能够较为准确地反映调查结果,同时也显得 比较直观。 现给出支持人数 A,反对人数 B,以及一个上限 L, 请你将 A 比 B 化简为 A’比 B’,要求在 A’和 B’均 不大于 L 且 A’和 B’互质(两个整数的最大公约数 是 1)的前提下,A’/B’ ≥ A/B 且 A’/B’ - A/B 的值 尽可能小。

NOIP2014初赛普及组C 题目及答案

NOIP2014初赛普及组C  题目及答案

第二十届全国青少年信息学奥林匹克联赛初赛

普及组C++语言试题2014年

一、快单项选择题(共20题,每题1.5分,共计30分;每题有且仅有一个正确选项)

⒈以下哪个是面向对象的高级语言( )。

A.汇编语言

B.C++

C.Fortran

D.Basic

⒉1TB代表的字节数是( )。

A.2的10次方

B.2的20次方

C.2的30次方

D.2的40次方

⒊二进制数00100100和00010101的和是( )。

A.00101000

B.001010100

C.01000101

D.00111001

⒋以下哪一种设备属于输出设备( )。

A.扫描仪

B.键盘

C.鼠标

D.打印机

⒌下列对操作系统功能的描述最为完整的是( )。

A.负责外设与主机之间的信息交换

B.负责诊断机器的故障

C.控制和管理计算机系统的各种硬件和软件资源的使用

D.将没有程序编译成目标程序

⒍CPU、存储器、I/O设备是通过( )连接起来的。

A.接口

B.总线

C.控制线

D.系统文件

⒎断电后会丢失数据的存储器是( )。

A.RAM

B.ROM

C.硬盘

D.光盘

⒏以下哪一种是属于电子邮件收发的协议( )。

A.SMTP

B.UDP

C.P2P

D.FTP

⒐下列选项中不属于图像格式的是( )。

A.JPEG格式

B.TXT格式

C.GIF格式

D.PNG格式

⒑链表不具有的特点是( )。

A.不必事物估计存储空间

B.可随机访问任一元素

C.插入删除不需要移动元素

D.所需空间与线性表长度成正比

⒒下列各无符号十进制整数中,能用八位二进制表示的数中最大的是( )。

A.296

B.133

C.256

D.199

全国 2014 noip 普及组试题比例简化

全国 2014 noip 普及组试题比例简化

全国2014 noip 普及组试题比例简化全国2014年NOIP普及组试题比例简化如下:

1. 选择题:共20题,占总分比例30%。

2. 填空题:共5题,占总分比例10%。

3. 程序阅读理解题:共4题,占总分比例10%。

4. 程序设计题:共3题,占总分比例20%。

5. 算法设计与分析题:共2题,占总分比例10%。

6. 暴力搜索题:共1题,占总分比例5%。

7. 数据结构与算法应用题:共1题,占总分比例5%。

NOIP2014提高组复赛试题day1day2

NOIP2014提高组复赛试题day1day2

CCF全国信息学奥林匹克联赛(NOIP2014复赛

提高组dayl

1.生活大爆炸版石头剪刀布

(rps.cpp/c/pas)

【问题描述】

石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳样,则不分胜负。在《生活大爆炸》第二季第8集中出现了一种石头剪刀布的升级版游戏。升级版游戏在传统的石头剪刀布游戏的基础上,增加了两个新手势:

斯波克:《星际迷航》主角之一。

蜥蜴人:《星际迷航》中的反面角色。

这五种手势的胜负关系如表一所示,表中列出的是甲对乙的游戏结果。

现在,小A和小B尝试玩这种升级版的猜拳游戏。已知他们的出拳都是有周期性规律的,

但周期长度不一定相等。例如:如果小A以“石头-布-石头-剪刀-蜥蜴人-斯波克”长度为

6的周期出拳,那么他的出拳序列就是“石头-布-石头-剪刀-蜥蜴人-斯波克-石头-布-石头

-剪刀-蜥蜴人-斯波克-……”,而如果小B以“剪刀-石头-布-斯波克-蜥蜴人”长度为5的周期出拳,那么他出拳的序列就是“剪刀-石头-布-斯波克-蜥蜴人-剪刀-石头-布-斯波克-蜥蜴人-……”

已知小A和小B一共进行N次猜拳。每一次赢的人得1分,输的得0分;平局两人都得0分。现请你统计N次猜拳结束之后两人的得分。

【输入】

输入文件名为rps.in。

第一行包含三个整数:N,NANB分别表示共进行N次猜拳、小A出拳的周期长度,小B出拳的周期长度。数与数之间以一个空格分隔。

第二行包含NA个整数,表示小A出拳的规律,第三行包含NB个整数,表示小B出拳的规律。其中,0表示“剪刀”,1表示“石头”,2表示“布”,3表示“蜥蜴人”,4表示“斯波克”。数与数之间以一个空格分隔。

NOIP2014 普及组 解题报告

NOIP2014 普及组 解题报告

jiě
tí bào ɡào
合肥市第四十五中学 王翰坤
2014.11
(完整试题可点此下载)
第 1 页 共 13 页
NOIP2014 普及组 解题报告
By yearwhk
1. 珠心算测试(count) 【问题简述】 已知一个正整数集合,集合中的数各不相同,求:其中有多少个数,恰好等于集合中另外两个(不同 的)数之和? 【问题分析】 历年普及组第一题总是很水,但今年的这一题的题意很多人理解错误,导致很多同学都只得了 30 分。 他们错把把题意理解为:求有多少对数的和正好是集合中的另一个数。如,对于集合{1,2,3,4,5},题目 要求的是 3=1+2, 4=2+2=1+3, 5=1+4=2+3,共 3 个数 ;而按照错误的理解,求的便是 1+2=3, 1+3=4, .. 1+4=5, 2+3=5,共 4 对数 。所以读题就显得多么重要! .. 明确了题意,接下来设计算法。注意到“测验题给出的正整数大小不超过 104”这个条件,我们可以采 用模拟的办法。具体算法如下: ①将每两个不同的数穷举相加求和,再将这个和打上标记; ②扫描所有集合中的数,统计所有被打上标记的数的数量。 简表: 时间复杂度 O(n2) 空间复杂度 O(max{ai})(max{ai}是集合中最大的数) 得分 100
这个方法和某年的普及组试题“明明的随机数”方法类似,能做到不遗漏、不重复。

2014noip复赛模拟练习11

2014noip复赛模拟练习11

1. 新学年就要开始了,爸爸把N元钱给了小青,让他购买一批文具,并作了以下要求:只能买圆珠笔、铅笔和铅笔芯,并且每样至少买一支,总数要超过30支,而且钱要全部花完。当小青去到文具店时,发现圆珠笔8角钱一支、铅笔2角钱一支、铅笔芯1角钱一支。小青怎么买才能符合爸爸的要求呢?请你编个程序帮他算出符合购买要求的所有方案总数。

Input :一个整数N,表示购买文具一共的元数。(1 <= N <= 50)

Output :一个整数,即符合购买要求的所有方案总数。

Sample Input 8 Sample Output 135

2. 任意一个数都可以由1、2、3三个数组合而成。如4有以下7种组合方案:1 + 1 + 1 + 1 1 + 1 + 2 1 + 2 + 1 2 + 1 + 1 2 + 2 1 + 3 3 + 1你的问题来了,对于给定的一个数,请你计算出这个整数可以有多少个组合方案,其和由1、2、3组合而成。数据输入:输入包含多组数据,每一组数据中,输入数据的第一行为一个整数n(1<=n<=20),要分解的数。

数据输出:这个整数的分解的组合数。

样例输入 4 样例输出7

3. 聪明的小地鼠:在学校里的试验田里面,种了n个大萝卜,小地鼠又非常的喜欢吃萝卜。它呢,就会出来偷偷的从试验田中偷萝卜。大萝卜都是种在一排地里面,认真的管理员,按照萝卜的位置早早的给萝卜编了号。希望能增加管理,保证产量。谁知道,小地鼠也有了自己的偷萝卜策略。

同样,在这个地里呢,正好也有n只小地鼠,这些小地鼠,他们都是按照顺序出来偷萝卜。小地鼠们根据自己的出场顺序编好号,然后开始根据自己的编号开始偷萝卜。因为,小地鼠的老大(即1号老鼠),很胖,所以他决定多偷萝卜了,而只是拿了1号萝卜,把剩余的萝卜交给他的小弟们。当然,他为了让管理员还能够有点收入,好以后继续种萝卜,就给小弟们,下达了一个命令。即每个地鼠只能拿自己编号倍数的大萝卜,但是不能拿与自己编号相同的萝卜。这样就能稍微给管理员留下一些萝卜了。可怜的管理员,你能告诉他,他最后能够剩下的大萝卜编号。

NOIP2014普及组初赛答案(C++)

NOIP2014普及组初赛答案(C++)

第二十届全国青少年信息学奥林匹克联赛初赛

普及组参考答案

一、单项选择题(共20 题,每题1.5 分,共计30 分)

二、问题求解(共2 题,每题5 分,共计10 分;每题全部答对得5 分,没有部分分)

1. 18

2. 11

三、阅读程序写结果(共4 题,每题8 分,共计32 分)

1. Ans = 9

2. -11

3. HELLO, MY NAME IS LOSTMONKEY.

4. 10

四、完善程序(共计28 分,以下各程序填空可能还有一些等价的写法,由各省赛区组织本省专家审定及上机验证,可以不上报CCF NOI 科学委员会复核)

NOIP2014提高组复赛试题day1day2

NOIP2014提高组复赛试题day1day2

CCF全国信息学奥林匹克联赛(NOIP2014)复赛

提高组 day1

1.生活大爆炸版石头剪刀布

(rps.cpp/c/pas)

【问题描述】

石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。在《生活大爆炸》第二季第8集中出现了一种石头剪刀布的升级版游戏。升级版游戏在传统的石头剪刀布游戏的基础上,增加了两个新手势:

斯波克:《星际迷航》主角之一。

蜥蜴人:《星际迷航》中的反面角色。

这五种手势的胜负关系如表一所示,表中列出的是甲对乙的游戏结果。

表一石头剪刀布升级版胜负关系

剪刀石头布蜥蜴人斯波克甲对乙的

甲结果

剪刀平输赢赢输

石头平输赢输

布平输赢蜥蜴人平赢

斯波克平

现在,小A和小B尝试玩这种升级版的猜拳游戏。已知他们的出拳都是有周期性规律的,但周期长度不一定相等。例如:如果小A以“石头-布-石头-剪刀-蜥蜴人-斯波克”长度为6的周期出拳,那么他的出拳序列就是“石头-布-石头-剪刀-蜥蜴人-斯波克-石头-布-石头-剪刀-蜥蜴人-斯波克-……”,而如果小B以“剪刀-石头-布-斯波克-蜥蜴人”长度为5的周期出拳,那么他出拳的序列就是“剪刀-石头-布-斯波克-蜥蜴人-剪刀-石头-布-斯波克-蜥蜴人-……”

已知小A和小B一共进行N次猜拳。每一次赢的人得1分,输的得0分;平局两人都得0分。现请你统计N次猜拳结束之后两人的得分。

【输入】

输入文件名为rps.in。

第一行包含三个整数:N,NA,NB,分别表示共进行N次猜拳、小A出拳的周期

长度,小B出拳的周期长度。数与数之间以一个空格分隔。

NOIP2014普及组复赛试题讲解(c++版本)

NOIP2014普及组复赛试题讲解(c++版本)
- 12 -
暴力搜索程序模块
void h(int g) { if(g==col+1) { int t=pd(); if(t<ans) ans=t; return; } if(m-c[g-1]>=col-g+1) { for(int i=c[g-1]+1;i<=m;i++) { c[g]=i; h(g+1);} } }
-4-
确定解题思路
L很小,还是枚举
分别枚举化简之后的A’和B’
判断A’/B’ >=A/B,避免精度问题,转换成乘法 A’*B>=A*B’
判断互质,最大公约数为1 判断A’和B’最小
A’*ansB<=ansA*B’ 找到更小的A’和B’ 设置为ansA和ansB
-5-
主程序
#include <iostream> using namespace std; int gcd(int x,int y) { int t; t=x%y; if(t==0) return y; else return gcd(y,t); } int main() { int a,b,l,a1,b1,ansa,ansb; cin>>a>>b>>l; ansa=100;ansb=1; for(a1=l;a1>=1;a1--) for(b1=l;b1>=1;b1--) { if(a1*b>=a*b1) if(gcd(a1,b1)==1) if(ansa*b1>ansb*a1) { ansa=a1; ansb=b1; } } cout<<ansa<<" "<<ansb; return 0; }

2019年noip2014普及组复赛题解

2019年noip2014普及组复赛题解

2019年noip2014普及组复赛题解

1.珠心算测验

注意看清题意:其中有多少个数,恰好等于集合中另外两个(不同的)数之和。这样的题意加上100的规模,建议暴力3个for: #include

#include

#include

#include

using namespace std;

int n;

int a[105];

int main(){

freopen("","r",stdin);

freopen("","w",stdout);

scanf("%d",&n);

for(int i=1; i<=n; i++){

scanf("%d",&a[i]);

}

sort(a+1,a+n+1);

int res=0;

for(int i=1; i<=n; i++){

int ok=0;

for(int j=1; j<=n && !ok; j++) if(j!=i){

for(int k=1; k<=n && !ok; k++) if(a[k]!=a[j]){

if(a[j]+a[k]==a[i]) ok=1;

}

}

res+=ok;

}

printf("%d\n",res);

return 0;

}

2.比例简化

L很小,还是枚举,然后比较的话建议用乘法比较,避免精度问题:#include

#include

#include

using namespace std;

int A,B,L;

int gcd(int a,int b){

if(b==0) return a;

return gcd(b,a%b);

}

int main(){

2014noip复赛模拟练习16(答案)

2014noip复赛模拟练习16(答案)
for i:=1 to a[0] do
begin
p:=p*10+a[i];
inc(b[0]);
b[b[0]]:=p div n;
p:=p mod n;
end;
if p=0 then begin
k:=1;
while b[k]=0 do inc(k);
m:=0;
fillchar(a,sizeof(a),0);
8 50
8 42
-1输出No 190
Yes 9
Yes 0
Yes 8
输入9 30
9 32
11 30
12 30
12 10
11 59
14 30
14 30
8 50
8 42
-1输出No 2
No 60
Yes 11
Yes 0
Yes 8
输入10 0
9 59
11 22
12 0
19 30
19 32
24 30
24 30
12 10
220 70 310
40 400 220
【样例输出】
550
【分析】二维背包
【源程序】
Program v1334;
Var
f:array[0..400,0..400]of longword;
n,maxv,maxw,v,w,p,i,j,k:longword;

蓝桥杯少儿编程比赛14届题解c++

蓝桥杯少儿编程比赛14届题解c++

蓝桥杯少儿编程比赛14届题解(C++)

一、题目描述

本题是蓝桥杯少儿编程比赛14届的一道题目,要求编写一个程序,实现对一个由字母和数字构成的字符串进行排序,其中字母按照字母表顺序从小到大排序,数字按照从大到小排序。

二、思路分析

我们可以使用C++中的字符串处理函数将数字和字母分开,并将它们分别存放在两个数组中。然后对字母数组进行升序排序,对数字数组进行降序排序。最后,我们再将两个数组合并起来,得到最终排序结果。

具体步骤如下:

1.定义一个字符串变量,用于存储输入的字符串。

2.定义两个数组,一个用于存储字母,一个用于存储数字。

3.使用循环遍历输入的字符串,判断每个字符是字母还是数字,并将其

分别存放在对应的数组中。

4.对字母数组进行升序排序,可以使用C++中的sort函数进行排序。

5.对数字数组进行降序排序,可以使用C++中的sort函数,并传入一

个自定义的降序比较函数。

6.将两个数组合并到一个新的数组中。

7.输出结果。

三、代码实现

下面是使用C++实现该题目的代码:

#include <iostream>

#include <string>

#include <algorithm>

using namespace std;

bool cmp(char a, char b) {

return a > b;

}

int main() {

string input;

cin >> input;

int len = input.length();

char* letters = new char[len]; // 存储字母

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

试题分析
BYE
温馨提示: 本题解内的程序都已经AC,由 于代码较长,可以查看CPP文件
The END
2017. 07. 28
知识回顾 Knowledge Review
祝您成功!
➢ 直接三重循环穷举 ➢ 外层循环枚举和,两个内层循环分别枚举两个加数,如果
有两个数之和对应外层循环的枚举值,退出两个内层循环 ➢ 注意:找到满足等式的必须退出两个内循环。 ➢ 注意看清题意:其中有多少个数,恰好等于集合中另外两
个(不同的)数之和。
-2-
参考程序 C++
➢ #include <iostream>
- 16 -
数据结构
➢ a[maxn][maxn] // 存放原数据n行m列的矩阵 ➢ r[maxn] // c存放枚举出的行号 ➢ vx[maxn][maxn][maxn] // vx[I][K][J] 记录i行k列与j
列之间的差值的绝对值 ➢ w[maxn]// j列各行之间的分数 ➢ v[maxn][maxn]// k,j两列之间的分数 ➢ f[maxn][maxn]//i列,最后一列是j 的最小分数 且第i列是j
➢ for(int j=1;j<col;j++)

sum+=abs(a[r[i]][c[j]]-a[r[i]][c[j+1]]);
➢ for(int j=1;j<=col;j++)
➢ for(int i=1;i<row;i++)

sum+=abs(a[r[i]][c[j]]-a[r[i+1]][c[j]]);
➢}
- 15 -
确定解题思路AC
➢ 思路:搜索+DP ➢ 枚举出选那些行 ➢ 算出j列各行之间的分数w[j],k,j两列之间的分数v[k][j]。 ➢ f[i][j]表示已经选了i(数量)列,最后一列是j (下标)的最小分数 且第i列是j ➢ 状态转移方程:f[i][j]=min(f[i-1][k]+w[j]+v[k][j])。

ansa=100;ansb=1;
➢}
-6-
第3题 “ 螺旋矩阵”简述
➢ 一个n行n列的螺旋矩阵可由如下方法生成: ➢ 从矩阵的左上角(第1行第1列)出发,初始时向右移动;
如果前方是未曾经过的格子,则继续前进,否则右转;重 复上述操作直至经过矩阵中所有格子。根据经过顺序,在 格子中依次填入1, 2, 3, ... , n2,便构成了一个螺旋矩阵。 ➢ 下图是一个n = 4 时的螺旋矩阵。
➢ 现给出矩阵大小n以及i和j,请你求出该矩阵中第i行第j列 的数是多少。
-7-
确定解题思路
➢ 思想:剥洋葱皮(分成一个个‘口’ ) ➢ 先找出这个点在第几个‘口’中。 ‘口’的边长就是n-2*c+2。c表示层 ➢ 一个个‘口’,整行整列处理 ➢ u表示最上行,d表示最下行,l表示最左列,r表
示最右列,计算出起始数值,判断目标行、列是否 在这个‘口’中,按u-r-d-l的顺序判断。 ➢ 没有找到,目标行、列,则收缩一圈,循环执行
- 17 -
参考程序(DP部分)
➢ void dp()
➢{

memset(w,0,sizeof(w));

memset(v,0,sizeof(v));

memset(f,127,sizeof(f));

for(int j=1;j<=m;j++)

for(int i=2;i<=row;i++)

w[j]+=abs(a[r[i]][j]-a[r[i-1]][j]);
➢ for(int j=i;j<=m;j++)

for(int k=i-1;k<=j-1;k++)

f[i][j]=min(f[i][j],f[i-1][k]+v[k][j]+w[j]);
➢ for(int i=col;i<=m;i++)
➢ ans=min(ans,f[col][i]);
➢}
- 18 -
➢ using namespace std;
➢ int gcd(int x,int y)
➢{

int t;

t=x%y;

if(t==0)

return y;

for(a1=l;a1>=1;a1--)

for(b1=l;b1>=1;b1--)

{

if(a1*b>=a*b1)

if(gcd(a1,b1)==1)

if(ansa*b1>ansb*a1)
{

else return gcd(y,t);

ansa=a1;
➢}
➢ ansb=b1;
➢ int main()
➢}
➢{

}

int a,b,l,a1,b1,ansa,ansb; ➢ cout<<ansa<<" "<<ansb;

cin>>a>>b>>l;
➢ return 0;
➢ 不过,如果把调查结果就以这种方式呈现出来,大多数人 肯定不会满意。因为这个比例的数值太大,难以一眼看出 它们的关系。对于上面这个例子,如果把比例记为5:3,虽 然与真实结果有一定的误差,但依然能够较为准确地反映 调查结果,同时也显得比较直观。
➢ 现给出支持人数A,反对人数B,以及一个上限L,请你将A 比B化简为A’比B’,要求在A’和B’均不大于L且A’和B’互质 (两个整数的最大公约数是1)的 前 ᨀ 下 ,A’/B’ ≥ A/B且 A’/B’ - A/B的值尽可能小。
➢}

for(j=1;j<n;j++)

{

for(k=j+1;k<=n;k++)

if (a[i]==a[j]+a[k]) {
f=true; ans++; break; } if(f) break; } } cout<<ans; return 0;
-3-
第2题 “比例简化”简述
➢ 在社交媒体上,经常会看到针对某一个观点同意与否的民 意调查以及结果。例如,对某一观点表示支持的有1498 人, 反对的有902 人,那么赞同与反对的比例可以简单的记为 1498:902。
NOIP2014 普及组复赛题解
NOIP2014普及组C++
试题分析
2017. 07. 28
第1题 “珠心算测验”简述
➢ 某学校的珠心算老师采用一种快速考察珠心算加法 能力的测验方法。他随机生成一个正整数集合,集 合中的数各不相同,然后要求学生回答:其中有多 少个数,恰好等于集合中另外两个(不同的)数之 和?
-4-
确定解题思路
➢ L很小,还是枚举
➢ 分别枚举化简之后的A’和B’ ➢判断A’/B’ >=A/B,避免精度问题,转换成乘法
A’*B>=A*B’
➢ 判断互质,最大公约数为1
➢ 判断A’和B’最小
A’*ansB<=ansA*B’ 找到更小的A’和B’
设置为ansA和ansB
-5-
主程序
➢ #include <iostream>
-8-
参考程序
➢ #include<iostream>
➢ using namespace std;
➢ int main()
➢{

long int n,u,d,l,r,s=0,x,y;

cin>>n>>x>>y;

u=l=1;d=r=n;

while(1)

if(x==u)

{s=s+y-l+1;break;}

➢ using namespace std;

Βιβλιοθήκη Baidu
➢ int main()

➢{


int n,i,j,k,ans=0;


int a[105];


cin>>n;


for(i=1;i<=n;i++)


cin>>a[i];


for(i=1;i<=n;i++)//和为A[i] ➢

{


bool f=false;

else

{s=s+r-l;

if(y==r)

{s=s+x-u+1;
break;}

else

{s=s+d-u;

if(x==d)


{s=s+r-
y+1; break;}

else

{s=s+r-l;

if(y==l)

{s=s+d-x+1;break;}

else

{s=s+d-u;

u++;l++;
➢ return sum;
➢}
- 14 -
暴力搜索程序模块
➢ int main()
➢{
➢ cin>>n>>m>>row>>col;
➢ for(int i=1;i<=n;i++)
➢ for(int j=1;j<=m;j++)

cin>>a[i][j];
➢ w(1);
➢ cout<<ans;
➢ return 0;

for(int j=1;j<=m;j++)

f[1][j]=w[j];

for(int j=2;j<=m;j++)

for(int k=1;k<j;k++)

for(int i=1;i<=m;i++)

v[k][j]+=vx[r[i]][k][j];
➢ for(int i=2;i<=col;i++)

d--;r--;

}

}

}
-9-
第4题 “子矩阵”简述
- 10 -
暴力搜索(预计得分50分)
➢ 构造出行(DFS) ➢ 构造出列(DFS) ➢ 计算目前的子矩阵的分值
- 11 -
暴力搜索程序模块
➢ void w(int k)
➢{
if(k==row+1)
➢ { h(1);//进入列搜索

return; }

return; }
➢ if(m-c[g-1]>=col-g+1)
➢ { for(int i=c[g-1]+1;i<=m;i++)

{ c[g]=i;

h(g+1);}
➢}
➢}
- 13 -
暴力搜索程序模块
➢ int pd()
➢{
➢ int sum=0;
➢ for(int i=1;i<=row;i++)
➢ if(n-r[k-1]>=row-k+1)
➢ { for(int i=r[k-1]+1;i<=n;i++)

{ r[k]=i;

w(k+1);}
➢}
➢}
- 12 -
暴力搜索程序模块
➢ void h(int g)
➢ { if(g==col+1)
➢ { int t=pd();

if(t<ans) ans=t;
相关文档
最新文档