1、[NOIP2017 普及组] 成绩

分析

签到题,略。

代码

#include<iostream>
#include<cstdio>using namespace std;int A,B,C;int score(int,int,int);void init();void solve();int main(){init();solve();return 0;
}int score(int a,int b,int c){return 0.2*a+0.3*b+0.5*c;
}void init(){scanf("%d%d%d",&A,&B,&C);
}void solve(){printf("%d",score(A,B,C));
}

2、P3955 [NOIP2017 普及组] 图书管理员

分析

本题主要目的是将编号 iii 的读者需求码 readerId[i]readerId[i]readerId[i] 与从小到大排名后的图书编码 bookId[i]bookId[i]bookId[i] 进行比较,遇到合适值直接输出并进入下一个编号中。

比较方式是取图书编码 bookId[i]bookId[i]bookId[i] 最后 num[i]num[i]num[i] 个数字,即判断条件为 bookId[i]%10num[i]=readerId[i]bookId[i]\%10^{num[i]}=readerId[i]bookId[i]%10num[i]=readerId[i] 。

代码

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>using namespace std;const int MAXN=1e3;int n,q;//书的数量、读者的数量 int bookId[MAXN+10],readerId[MAXN+10];int num[MAXN+10];void init();void solve();int main(){init();solve();return 0;
}void init(){int i;scanf("%d%d",&n,&q);for(i=0;i<n;++i){scanf("%d",bookId+i);}for(i=0;i<q;++i){scanf("%d",num+i);scanf("%d",readerId+i);}
}void solve(){int i,j,t;bool judge;sort(bookId,bookId+n);for(i=0;i<q;++i){t=pow(10,num[i]);judge=1;for(j=0;j<n;++j){if(bookId[j]%t==readerId[i]){printf("%d\n",bookId[j]);judge=0;break;}}if(judge){printf("-1\n");}}
}

3、P3956 [NOIP2017 普及组] 棋盘

分析

类似迷宫图,主要使用记忆化 BFSBFSBFS 搜索。

令表示方式如下:

当前格 下一格
坐标 (x,y)(x,y)(x,y) (tx,ty)(tx,ty)(tx,ty)
颜色 ccc tctctc
最少金币 sss tststs

当前格 (x,y)(x,y)(x,y) 和下一格 (tx,ty)(tx,ty)(tx,ty) 的颜色情况 (c,tc)(c,tc)(c,tc) :

if tc==-1:  # 下个节点没有颜色 if table[x][y]==-1:  # 已经施过魔法continueif s+2<ts:  # 将下个节点变为同色minValue[tx][ty]=s+2q.push((node){tx,ty,c,s+2})
elif c==tc:  # 下个节点和当前颜色相同if s<ts:minValue[tx][ty]=sq.push((node){tx,ty,tc,s})
elif c!=tc:  # 下个节点和当前颜色不同if s+1<ts:minValue[tx][ty]=s+1q.push((node){tx,ty,tc,s+1})

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>using namespace std;const int MAXM=1e2;
const int MAXN=1e3;struct node{int x,y,c,s;//坐标 (x,y),颜色 c,需求金币数s
};
queue<node> q;int ans=0x7f7f7f7f;//记录答案的最小值 int turn[4][2]={0,1,0,-1,1,0,-1,0};//控制方向 int table[MAXM+10][MAXM+10];//棋盘
int minValue[MAXM+10][MAXM+10];//棋盘中各点的最小值 int m,n;//棋盘大小,有颜色格子的数量 void init();void solve();int main(){init();solve();return 0;
}void init(){int i,j,x,y,c;scanf("%d%d",&m,&n);memset(minValue,0x7f,sizeof(minValue));memset(table,-1,sizeof(table));
//  for(i=0;i<m;++i){
//      for(j=0;j<m;++j){
//          printf("%d\t",table[i][j]);
//      }
//      printf("\n");
//  }for(i=0;i<n;++i){scanf("%d%d%d",&x,&y,&c);table[x][y]=c;}}void solve(){int i,j;int tx,ty,tc,ts;//BFSminValue[1][1]=0;q.push((node){1,1,table[1][1],0});//压入起点 while(!q.empty()){//获取当前节点信息 node tmp=q.front();q.pop();int x=tmp.x,y=tmp.y,c=tmp.c,s=tmp.s;//判断是否到终点 if(x==m&&y==m){ans=min(ans,minValue[x][y]);}for(i=0;i<4;++i){tx=x+turn[i][0],ty=y+turn[i][1];if(tx>0&&ty>0&&tx<=m&&ty<=m){tc=table[tx][ty],ts=minValue[tx][ty];if(tc==-1){//下个节点没有颜色 if(table[x][y]==-1)//已经施过魔法 continue;if(s+2<ts){//将下个节点变为同色 minValue[tx][ty]=s+2;q.push((node){tx,ty,c,s+2});}}else if(c==tc){//下个节点和当前颜色相同 if(s<ts){minValue[tx][ty]=s;q.push((node){tx,ty,tc,s});}}else if(c!=tc){//下个节点和当前颜色不同 if(s+1<ts){minValue[tx][ty]=s+1;q.push((node){tx,ty,tc,s+1});}}}}}if(ans==0x7f7f7f7f){printf("-1");return;}printf("%d",ans);
}

4、P3957 [NOIP2017 普及组] 跳房子

分析

表1 变量定义

变量 定义
nnn 格子数量
ddd 原弹跳距离
kkk 希望的分数
x[i]x[i]x[i] 格子 iii 的坐标
s[i]s[i]s[i] 格子 iii 的分数
ggg 消耗的金币
dp[i]dp[i]dp[i] 格子i的最大分数
mindmindmind 距离最小值
maxdmaxdmaxd 距离最大值

图1 跳格子的范围表示 1、令$mind=max(d-g,1)$、$maxd=d+g$,弹跳范围为 $\left[ mind,maxd \right]$。

2、若花费 ggg 枚金币能得到 kkk 分,则花费 g+1g+1g+1 枚金币依旧能够得到 kkk 分,因此答案 g∈[0,x[n]]g∈[\ 0,\ x[n]\ ]g∈[ 0, x[n] ],可用二分进行搜索。

3、可以通过动态规划来表示格子 iii 的最大分数,dp[i]=max(dp[j]+s[i],dp[i])dp[i]=max(dp[j]+s[i],dp[i])dp[i]=max(dp[j]+s[i],dp[i]) {j∣mind≤x[i]−x[j]≤maxd}\{\ j\ |\ mind≤x[i]-x[j]≤maxd \ \}{ j ∣ mind≤x[i]−x[j]≤maxd };可以简化为 dp[i]=max(dp[j])+sdp[i]=max(dp[j])+sdp[i]=max(dp[j])+s

代码

1、二分 +dp+\ dp+ dp( 505050 分)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>using namespace std;const int MAXN=5e5;int g;//消耗的金币int n;//格子数量
int d;//原弹跳距离
int k;//希望的分数int x[MAXN+10];//格子 i 的坐标
int s[MAXN+10];//格子 i 的分数
int dp[MAXN+10];//格子 i 的最大分数 void init();bool judge(int);void solve();int main(){init();solve();return 0;
}void init(){int i;scanf("%d%d%d",&n,&d,&k);for(i=1;i<=n;++i){scanf("%d%d",x+i,s+i);}}bool judge(int mid){memset(dp,-0x7f7f7f7f,sizeof(dp));dp[0]=0;int i,j;int mind=max(d-mid,1);int maxd=d+mid;for(i=1;i<=n;++i){for(j=0;j<i;++j){if(x[i]-x[j]>=mind&&x[i]-x[j]<=maxd){dp[i]=max(dp[j]+s[i],dp[i]);//dpif(dp[i]>=k){//mid右侧均满足最大分数 ≥k return true;}}}}return 0;//mid左侧均不满足最大分数 ≥k
}void solve(){int l=0,r=x[n];//g的可选范围 int mid;//二分搜索 while(l!=r){mid=(l+r)/2;//判断答案在mid左侧(true)还是右侧(false) if(judge(mid)){r=mid;//左侧搜索 }else{l=mid+1;//右侧搜索 }}if(judge(l)){printf("%d",l);}else{//搜索完成后未找到g printf("-1");}}

2、剪枝

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>using namespace std;typedef long long LL;const int MAXN=5e5;LL n;//格子数量
LL d;//原弹跳距离
LL k;//希望的分数LL x[MAXN+10];//格子 i 的坐标
LL s[MAXN+10];//格子 i 的分数
LL dp[MAXN+10];//格子 i 的最大分数 void init();bool judge(int);void solve();int main(){init();solve();return 0;
}void init(){int i;scanf("%lld%lld%lld",&n,&d,&k);for(i=1;i<=n;++i){scanf("%lld%lld",x+i,s+i);}}bool judge(int mid){memset(dp,-0x7f7f7f7f,sizeof(dp));dp[0]=0;int i,j;LL mind=max(d-mid,1LL);LL maxd=d+mid;for(i=1;i<=n;++i){for(j=i-1;j>=0;--j){if(x[i]-x[j]>maxd)break;if(x[i]-x[j]<mind)continue;dp[i]=max(dp[j]+s[i],dp[i]);//dpif(dp[i]>=k){//mid右侧均满足最大分数 ≥k return true;}}}return false;//mid左侧均不满足最大分数 ≥k
}void solve(){LL l=0,r=2010;//g的可选范围 LL mid;//二分搜索 while(l!=r){mid=(l+r)>>1;//判断答案在mid左侧(true)还是右侧(false) if(judge(mid)){r=mid;//左侧搜索 }else{l=mid+1;//右侧搜索 }}if(judge(l)){printf("%lld",l);}else{//搜索完成后未找到g printf("-1");}}

NOIP2017 普及组题解相关推荐

  1. P3955 [NOIP2017 普及组] 图书管理员C++题解

    洛谷来源:P3955 [NOIP2017 普及组] 图书管理员 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/sol ...

  2. [NOIP2017 普及组]跳房子 【题解】

    题目背景 NOIP2017 普及组 T4 题目描述 跳房子,也叫跳飞机,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一. 跳房子的游戏规则如下: 在地面上确定一个起点,然后在起点右侧画 n n ...

  3. 信息学奥赛一本通 1414:【17NOIP普及组】成绩 | 洛谷 P3954 [NOIP2017 普及组] 成绩

    [题目链接] ybt 1414:[17NOIP普及组]成绩 洛谷 P3954 [NOIP2017 普及组] 成绩 [题目考点] 1. 算术表达式 2. 自动类型转换 低精度类型与高精度类型计算结果是高 ...

  4. 信息学奥赛一本通 1415:【17NOIP普及组】图书管理员 | 洛谷 P3955 [NOIP2017 普及组] 图书管理员

    [题目链接] ybt 1415:[17NOIP普及组]图书管理员 洛谷 P3955 [NOIP2017 普及组] 图书管理员 [题目考点] 1. 枚举 2. 二分 [解题思路] 解法1:枚举 对于每个 ...

  5. noi2017初赛c语言试题,NOIP2017普及组初赛试题及答案

    原标题:NOIP2017普及组初赛试题及答案 清北学堂信息学金牌教研团今天为学生们整理了NOIP2017普及组初赛试题及答案,供学生们参考哦! --此文2100多文字,大概需要60分钟看完 一.单项选 ...

  6. P3954 [NOIP2017 普及组] 成绩(python3实现)

    https://www.luogu.com.cn/problem/P3954 """P3954 [NOIP2017 普及组] 成绩 https://www.luogu.c ...

  7. 2019NOIP普及组题解

    2019NOIP普及组题解 最近重新捡起了好久没学的算法,刚好2019NOIP刚刚比赛完,就去做了一下普及组的题目(提高组太变态了),感觉思维方面的东西比较多,相对来说数据结构考的不是很复杂,难点大多 ...

  8. [NOIP2017 普及组] 棋盘

    [NOIP2017 普及组] 棋盘 题目背景 NOIP2017 普及组 T3 题目描述 有一个m×mm \times mm×m的棋盘,棋盘上每一个格子可能是红色.黄色或没有任何颜色的.你现在要从棋盘的 ...

  9. P3954 [NOIP2017 普及组] 成绩

    题目背景 NOIP2017 普及组 T1 题目描述 牛牛最近学习了 C++ 入门课程,这门课程的总成绩计算方法是: 总成绩=作业成绩×20%+\times 20\%+×20%+小测成绩×30%+×30 ...

  10. ybt1414 成绩(NOIP2017普及组第1题)

    ybt1414  成绩(NOIP2017普及组第1题) 时空限制    1000ms/64MB 题目描述 牛牛最近学习了C++入门课程,这门课程的总成绩计算方法是: 总成绩=作业成绩×20%+小测成绩 ...

最新文章

  1. php7-fpm webtatic,如何在 CentOS 7 中使用 Nginx 和 PHP7-FPM 安装 Nextcloud
  2. MySQL 5.5单实例 编译安装
  3. 间接寻址级别不同_详解西门子间接寻址之地址寄存器间接寻址
  4. CentOS安装nmap端口查看工具
  5. 北交的计算机和北理,北航与北理
  6. ThreadLocal - Java多线程编程
  7. 众信旅游:旅游及相关产品会参与阿里双十一活动
  8. maven profile多环境动态配置文件使用
  9. ecshop 影响全局的标量lib_main.php
  10. 剑指offer :跳台阶
  11. C语言方波转换正弦波,方波转换成正弦波电路
  12. flashpaper
  13. 学习笔记——STM32摄像头OV7725(一)
  14. 还在搞三层架构?了解下 DDD 分层架构的三种模式吧 !
  15. 微信提现报证书已过期
  16. 五则运算c语言程序,C语言算术运算示例程序
  17. Web前端技术个人学习经验总结
  18. 看张亚飞《.Net for Flash FMS》的笔记
  19. 第十八篇:融汇贯通--谈USB Video Class驱动
  20. 金融业-xirr函数------Java实现

热门文章

  1. cocos2dx 圆盘抽奖_Cocos2D-X转盘游戏制作教程:博彩大转盘
  2. excel线性拟合的斜率_Excel 应用SLOPE函数计算线性回归线的斜率
  3. 【资源分享】分享十个历史版本的eclipse安装包
  4. linux中实现getch函数
  5. 一些常用的正交试验表生成: 单一水平、混合水平、交互作用
  6. SWF是什么文件,SWF文件用什么软件可以打开
  7. javascript优缺点
  8. 暴风影音皮肤_暴风影音16周年纪念版 v9.04
  9. 微电子专业深度盘点:哪所大学芯片最强?强在哪?(第2弹)
  10. 数学建模保姆教程-1