tceic.com
简单学习网 让学习变简单
当前位置:首页 >> 学科竞赛 >>

noip2015普及组解题报告


n oip 2015 普及组题解 1. 金币 (coin.cpp/c/pas) 【问题描述】 国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后 两天(第 二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三 枚金 币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会 一直这样延续下去: 当连续N天每天收到N枚金币后,

骑士会在之后的连续N+1天里,每 天收 到N+1枚金币。 请计算在前K天里,骑士一共获得了多少金币。 【输入格式】 输入文件名为coin.in。 输入文件只有1行,包含一个正整数K,表示发放金币的天数。 【输出格式】 输出文件名为coin.out。 输出文件只有 1 行,包含一个正整数,即骑士收到的金币数。 【样例输入】coin.in 6 【样例输出】coin.out 14 【输入输出样例1说明】 骑士第一天收到一枚金币;第二天和第三天,每天收到两枚金币; 第四、五、六天,每 天收到三枚金币。因此一共收到 1+2+2+3+3+3=14 枚金币。 【数据范围】对于 100%的数据,1 ≤K ≤10,000。 【题解】 纯模拟,直接爆搜,考点就是 for 循环 #include "stdio.h" #include "iostream" using namespace std; int main(){ freopen("coin.in","r",stdin); freopen("coin.out","w",stdout); int n,i=1,ans=0; cin>>n; while(n){ if(n>=i){ n-=i; ans+=i*i; }else{ ans+=i*n; n=0; } i++; } cout<<ans<<endl; return 0; } 2.扫雷游戏(mine.cpp/c/pas) 【问题描述】 扫雷游戏是一款十分经典的单机小游戏。在n行m列的雷区中有一些格子含有 地雷(称 之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格 时,该 格将会出现一个数字——提示周围格子中有多少个是地雷格。 游戏的目标是在不翻出任 何地雷格的条件下,找出所有的非地雷格。 现在给出n行m列的雷区中的地雷分布,要求计 算出每个非地雷格周围的地雷格数。 注:一个格子的周围格子包括其上、下、左、右、左 上、右上、左下、右下八个方向上 与之直接相邻的格子。 【输入格式】 输入文件名为mine.in。 输入文件第一行是用一个空格隔开的两个整数n和m, 分别表示雷区的行数和列数。 接下来n行,每行m个字符,描述了雷区中的地雷分布情况。 字符’*’表示相应格子是 地雷格,字符’? ’表示相应格子是非地雷格。相邻字符之间无分 隔符。 【输出格式】 输出文件名为mine.out。 输出文件包含 n 行,每行 m 个字符,描述整个雷区。用’*’表示地雷格,用周围的地 雷个数表示非地雷格。相邻字符之间无分隔符。

n oip 2015 普及组题解 【样例输入】 33 * ?? ??? ?* ? 【样例输出】 *10 221 1*1 【数据说明】 对于100% 的数据,1≤n≤100,1≤m≤100。 【题解】 行列数最多100 ,也就是 100*100 的单元格数量,一个个判断过去也就 100*100*8 个方 向,于 是还是暴搜。考点还是 for循环。 #include "stdio.h" #include "string.h" #include "stdlib.h" #include "iostream" using namespace std; int n,m; int matrix[105][105]; int dir[]={1,0,-1}; char ch[105]; int main(){ freopen("mine.in","r",stdin); freopen("mine.out","w",stdout); cin>>n>>m; int i,j,k,t; memset(matrix,0,sizeof(matrix)); for(i=1;i<=n;i++){ scanf("%s",ch+1); for(j=1;j<=m;j++){ if(ch[j]=='*'){ matrix[i][j]=-1; } } } for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ if(matrix[i][j]!=-1){ for(k=0;k<3;k++){ for(t=0;t<3;t++){ if(k!=1||t!=1){ if(matrix[i+dir[k]][j+dir[t]]==-1){ matrix[i][j]++; } } } } } } } for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ if(matrix[i][j]==-1){ putchar('*'); }else{ putchar(matrix[i][j]+'0'); }

}

n oip 2015 普及组题解 } putchar('\n'); } return 0;

3. 求和 (sum.cpp/c/pas) 【问题描述】 一条狭长的纸带被均匀划分出了n 个格子,格子编号从1 到n。每个格子上都染了一种颜色 (用[1,m]当中的一个整数表示),并且写了一个数字。 定义一种特殊的三元组:(x, y, z) ,其中x,y,z都代表纸带上格子的编号,这里的三元组要 求满足以下两个条件:

1. ,,都是整数,<<,?= ? 2. = 满足上述条件的三元组的分数规定为(x+z)?(+)。整个纸带的分数规定为 所有满足条件的三元组的分数的和。 这个分数可能会很大, 你只要输出整个纸带的分数除以 10,007所得的余数即可。 【输入格式】

【输出格式】 输出文件名为sum.out。 共一行,一个整数,表示所求的纸带分数除以10,007 所得的余数。 【样例输入】 62 553222 221121 【样例输出】 82 【输入输出样例1说明】 纸带如题目描述中的图所示。 所有满足条件的三元组为:(1,3,5),(4,5,6)。 所以纸带的分数为 (1+5)?(5+2)+(4+6)?(2+2)=42+40=82 。 【数据说明】 对于第1组至第2组数据,1≤ ≤100,1≤ ≤5; 对于第3组至第4组数据, ≤ ≤3000,1≤ ≤100; 对于第5组至第6组数据,1≤ ≤100000,1≤ ≤100000,且不存在出现次数超过20的颜色; 1≤≤100000,1≤≤100000,1≤≤,1≤≤100000。 【题解】 可以理解为 n 个元素每个元素有三个属性分别是数值 Number、颜色和编号,对于任意 两个满 足2个条件的元素进行相应的统计, 第1个条件其实等价于这两个元素的编号都是奇 数或都是 偶数,第2个条件是相同颜色值。 #include "stdio.h" #include "iostream" using namespace std; int sum[2][100005]; int color[100005]; int d[2][100005];

n oip 2015 普及组题解 int val[100005]; int n,m; int main(){ freopen("sum.in","r",stdin); freopen("sum.out","w",stdout); cin>>n>>m;int i,ans=0; for(i=1;i<=n;i++){ scanf("%d",&val[i]); val[i]%=10007; } for(i=1;i<=n;i++){ scanf("%d",&color[i]); sum[i%2][color[i]]+=val[i]; sum[i%2][color[i]]%=10007; d[i%2][color[i]]++; } for(i=1;i<=n;i++){ ans=(ans+i%10007*((sum[i%2][color[i]]+(d[i%2][color[i]]2)%10007*val[i]+10007)%10007))%10007; } cout<<ans<<endl; return 0; } 4. 推销员 (salesman.cpp/c/pas) 【问题描述】 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品。螺丝街是一条死胡同,出口与入 口是同一个,街道的一侧是围墙,另一侧是住户。螺丝街一共有 N家住户,第 i家住户到入口 的距离为Si 米。 由于同一栋房子里可以有多家住户, 所以可能有多家住户与入口的距离相等。 阿明会从入口进入,依次向螺丝街的X家住户推销产品,然后再原路走出去。 阿明每走1米就 会积累1点疲劳值, 向第i家住户推销产品会积累 Ai 点疲劳值。 阿明是工作狂, 他想知道,对于 不同的X,在不走多余的路的前提下,他最多可以积累多少点疲劳值。 【输入格式】 输入文件名为salesman.in。 第一行有一个正整数N,表示螺丝街住户的数量。 接下来的一行有N个正整数,其中第i个整数Si 表示第i家住户到入口的距离。数据保证 S1 ≤S2 ≤…≤Sn <108。 接下来的一行有N个正整数,其中第i个整数Ai 表示向第i户住户推销产品会积 累的疲劳值。 数据保证Ai <103 。 【输出格式】 输出文件名为salesman.out。 输出N 行,每行一个正整数,第i 行整数表示当X=i 时,阿明最多积累的疲劳值。 【样例输入1】 5 12345 12345 【样例输出1】 15 19 22 24 25 【输入输出样例1说明】 X=1: 向住户5推销,往返走路的疲劳值为5+5,推销的疲劳值为5,总疲劳值为15。 X=2: 向住户4、5推销,往返走路的疲劳值为5+5,推销的疲劳值为4+5,总疲劳值为 5+5+4+5=19。 X=3: 向住户3、4、5推销,往返走路的疲劳值为5+5,推销的疲劳值3+4+5,总疲劳值 为 5+5+3+4+5=22。 X=4: 向住户2、3、4、5推销,往返走路的疲劳值为5+5,推销的疲劳值2+3+4+5,总疲 劳值5+5+2+3+4+5=24。 X=5: 向住户 1、 2、 3、 4、 5 推销, 往返走路的疲劳值为 5+5, 推销的疲劳值 1+2+3+4+5,

n oip 2015 普及组题解 总疲劳值 5+5+1+2+3+4+5=25。 【样例输入 2 】 5 1 22 4 5 5 43 4 1 【样例输出 2 】 12 17 21 24 27 【输入输出样例2说明】 X=1:向住户4推销,往返走路的疲劳值为4+4,推销的疲劳值为4, 总疲劳值4+4+4=12。 X=2:向住户1、4推销,往返走路的疲劳值为4+4,推销的疲劳值为 5+4,总疲劳值 4+4+5+4=17。 X=3:向住户1、2、4推销,往返走路的疲劳值为4+4,推销的疲劳值为5+4+4,总疲劳值 4+4+5+4+4=21。 X=4:向住户1、2、3、4推销,往返走路的疲劳值为4+4,推销的疲劳值为5+4+3+4,总 疲 劳值4+4+5+4+3+4=24。或者向住户1、2、4、5推销,往返走路的疲劳值为5+5,推销的 疲 劳值为5+4+4+1,总疲劳值5+5+5+4+4+1=24。 X=5:向住户1、2、3、4、5推销,往返走路的 疲劳值为5+5,推销的疲劳值为5+4+3+4+1, 总疲劳值5+5+5+4+3+4+1=27。 【样例输入输出3】 见选手目录下的salesman/salesman3.in和salesman/salesman3.ans 。 【数据说明】 对于20%的数据,1≤N≤20; 对于40%的数据,1≤N≤100; 对于60%的数 据,1≤N≤1000; 对于 100% 的数据,1≤N≤100000。 【题解】 这道题目距离Si是保证严格不降的,对于前60分,只需要O(N^2)的算法 O(N^2)的算法的关 键是要发现找最大疲劳值, 要么是在距离点内找疲劳值最大的点, 要么是 增加距离范围找到 一个(疲劳值+增加的往返距离值最大)的点。 如果要拿到剩下的 40 分,需要优化选择下一个最优点的时间复杂度,有很多种方式, 这里 采用了树状数组维护区间最值的方法, 建立两个树状数组,分别表示当前距离范围内的最大 疲劳值、超过距离范围的(疲劳值+ 增加的往返距离值)最大值。 【题解】 #include "stdio.h" #include "string.h" #include "algorithm" #include "stdlib.h" #include "iostream" #include "queue" #include "vector" #include "stack" #include "math.h" using namespace std; struct node{ int x; int y; int name; }house[100005],cpy[100005]; int right; bool operator >(node a,node b){ if(a.y==b.y) return (a.x-b.x>0)?1:0; return (a.y-b.y>0)?0:1; }

n oip 2015 普及组题解 int cmp(const void *p,const void *q){ node *a=(node *)p; node *b=(node *)q; int t1=a->x*2+a->y; int t2=b->x*2+b->y; if(t1==t2) return a->x-b->x; return t2-t1; } int cmp2(const void *p,const void *q){ node *a=(node *)p; node *b=(node *)q; if(a->x==b->x) return a->y-b->y; return a->x-b->x; } int x,r; int ans[100005]; priority_queue < node , vector <node> ,greater <node> > q; int main(){ freopen("salesman.in","r",stdin); freopen("salesman.out","w",stdout); int n,i,j=1,k=1; cin>>n; for(i=1;i<=n;i++){ scanf("%d",&house[i].x); } for(i=1;i<=n;i++){ scanf("%d",&house[i].y); house[i].name=i; cpy[i].x=house[i].x; cpy[i].y=house[i].y; cpy[i].name=i; } qsort(house+1,n,sizeof(house[0]),cmp); qsort(cpy+1,n,sizeof(cpy[0]),cmp2); for(i=1;i<=n;i++){ if(q.empty()||q.top().y<(house[j].x-x)*2+house[j].y){ ans[i]=ans[i-1]+(house[j].x-x)*2+house[j].y; r=house[j].x; j++; while(cpy[k].x<r&&k<=n){ q.push(cpy[k]); k++; } x=r; }else{ ans[i]=ans[i-1]+q.top().y; q.pop(); } while(house[j].x<x&&j<=n){ j++; } } for(i=1;i<=n;i++) printf("%d\n",ans[i]); return 0; }


推荐相关:

noip2015普及组解题报告

noip2015普及组解题报告_学科竞赛_初中教育_教育专区。noip2015普及组解题报告 NOIP2015 普及组(Junior) 解题报告 1. 金币 (coin.cpp/c/pas) 国王将金币作为工资...


NOIP2015提高组解题报告

NOIP2015 提高组解题报告 T1 神奇的幻方【题目大意】 告诉你幻方的构造方法,给...NOIP2015提高组复赛试题... 6页 免费 NOIP2015提高组 6页 1下载券 NOIP2015...


NOIP2015提高组day1第二题解题报告

NOIP2015 提高组复赛 Day1 第二题解题报告 By 某蒟蒻 zrw 1. 题目大概描述(因为写的时候题目还没放出来)几个小盆友们在传递自己的信息(生日) ,并且每个小盆...


noip2015普及组题解最终

noip2015 普及组题解 by 郁庭 from 宁波市镇海蛟川书院 2015 年 11 月 11 日 如果要拿到剩下的 40 分,主要有三种方法: 方法一:利用数据结构优化 O(NlogN)...


NOIP2015普及组一等奖_图文

NOIP2015普及组一等奖_计算机软件及应用_IT/计算机_专业资料。NOIP2015普及组复赛一等奖名单 CCF NOIP2015 复赛普及组一等奖获奖名单证书编号 CCF-NOIP2015-1274 CCF-...


NOIP2015普及组复赛试题

CCF 全国信息学奥林匹克联赛(NOIP2015)复赛 CCF 全国信息学奥林匹克联赛(NOIP2015)复赛 普及组 (请选手务必仔细阅读本页内容)一、 题目概况 中文题目名称 金币 ...


NOIP2014普及组解题报告

NOIP2014 普及组复赛解题报告本人是潍坊一中的 wyw,69 级,今年高一, 现在马上就要 NOIP 了, 打算把历年的 NOIP 普及、提高组题目都做一下, 然后写写解题 报告...


NOIP2015初赛普及组参考答案

NOIP2015初赛普及组参考答案_IT认证_资格考试/认证_教育专区 暂无评价|0人阅读|0次下载|举报文档NOIP2015初赛普及组参考答案_IT认证_资格考试/认证_教育专区。NOIP...


NOIP2015普及组初赛试题及答案(Pascal)

NOIP2015普及组初赛试题及答案(Pascal)_学科竞赛_初中教育_教育专区。第二十一...? 试题纸共有 7 页,答题纸共有 2 第二十一届全国青少年信息学奥林匹克联赛...


NOIP2015提高组Pascal试题及参考答案

2015 年 10 月 11 日 14:30~16:30 选手注意: 试题纸共有 9 页,答题纸...NOIP2015普及组Pascal试... 7页 1下载券 noip2010提高组PASCAL初... 12页...

网站首页 | 网站地图
All rights reserved Powered by 简单学习网 www.tceic.com
copyright ©right 2010-2021。
文档资料库内容来自网络,如有侵犯请联系客服。zhit325@126.com