全国信息学奥林匹克联赛(NOIP2018)复赛
dalao组
(请dalao选手务必仔细阅读本页内容)
第三题下面有温馨提示
一.题目概览
中文题目名称 |
第一题 |
第二题 |
第三题 |
英文题目名称 |
T1 |
T2 |
T3 |
可执行文件名 |
T1.exe |
T2 |
T3 |
输入文件名 |
T1.in |
T2.in |
T3.in |
输出文件名 |
T1.out |
T2.out |
T3.out |
每个测试点时限 |
1秒 |
1秒 |
1秒 |
测试点数目 |
10 |
10 |
10 |
每个测试点分值 |
10 |
10 |
10 |
比较方式 |
全文比较(过滤行末空格及文末回车) |
||
题目类型 |
传统 |
传统 |
传统 |
二.提交源程序文件名
对于pascal语言 |
T1.pas |
T2.pas |
T3.pas |
对于C语言 |
T1.c |
T2.c |
T3.c |
对于C++语言 |
T1.cpp |
T2.cpp |
T3.cpp |
三.编译命令(不包含任何优化开关)
对于pascal语言 |
fpc T1.pas |
fpc T2.pas |
fpc T3.pas |
对于C语言 |
gcc –o T1.c -lm |
gcc –o T2.c -lm |
gcc –o T3.c -lm |
对于C++语言 |
g++ –o T1.cpp -lm |
g++ –o T2.cpp -lm |
g++ –o T3.cpp -lm |
四.运行内存限制
运行内存上限 |
128M |
128M |
128M |
注意事项:
1、文件名(程序名和输入输出文件名)必须使用英文小写。
2、C/C++中函数 main()的返回值类型必须是 int,程序正常结束时的返回值必须是 0。
3、全国统一评测时采用的机器配置为:CPU P4 3.0GHz,内存 1G,上述时限以此配置为准。
各省在自测时可根据具体配置调整时限。
1.第一题
(T1.pas/c/cpp)
【问题描述】
TZJ最近迷上了一款叫车丁卡泡泡(什么鬼)的游戏,成天漂移旋转还闭着眼。有一天,TZJ给zyj秀了一把道具赛,结果被别人虐的不要不要的,尤其是有个叫做导弹的道具怎么也打不到别人。Zyj最后扔下一句:“菜!”最后扬长而去留下了一只失去了信心的TZJ。深受打击的TZJ决定好好练习导弹的使用技巧,作为程序员的TZJ便做了一个脚本拿来练习。
TZJ的脚本让TZJ拥有了一条笔直的赛道,并且为了自己可以更好的打中自己要打中的n个目标,于是便让大家都保持不动。刚开始,胆怯的TZJ只刚开始的射程只有m(就是能打中于他的距离不大于m的目标),但是如果他每打中了一次目标,便会恢复一点自信,于是他的射程就会提高5。而他的导弹道具只有每次打中目标才会再补回一个(刚开始也就一个)。呢么作为上帝视角的你,能否知道他最多能够打中多少的目标并且当他打光自己的导弹时他的射程会变成多少呢?
【输入】
第一行两个正整数 n,m,表示总共有多少个目标和TZJ的起始射程
接下来的n行,代表这n个目标距离TZJ的距离。
【输出】
一行两个整数表示他最多打中的目标数和最终他的射程。
【输入输出样例】
T1.in |
T1.out |
3 70 60 75 80 |
3 85
|
【数据范围】
n<10000
注释:“我们皮日天是这样的。”又一次没打中别人输掉比赛。TZJ如是说道。
#include<iostream> #include<cstdio> using namespace std; int N,M,cnt=0; int a[10010]; bool f[10010]; bool flag; int main() { freopen("T1.in","r",stdin); freopen("T1.out","w",stdout); cin>>N>>M; for(int i=1;i<=N;i++) cin>>a[i]; while(true){ flag=0; for(int j=1;j<=N;j++) if(M>=a[j]&&f[j]==0){ f[j]=1; flag=1; M+=5; cnt++; } if(flag==0) break; } cout<<cnt<<' '<<M<<endl; return 0; }
2.第二题
(T2.pas/c/cpp)
【问题描述】
mzx去爬山了!现在有一排山,编号从1到n。
在m天之内,mzx每天都去爬山。每天,mzx都会选择一座山作为起点,向左或向右爬到第k个比起点高或低的山峰。mzx想知道他每天会爬到哪座山。
【输入】
第一行两个整数n,m,第二行为用空格隔开的n个数,代表编号为1到n的山峰的高度。从第三行到第m+2行,每行四个数a,b,x,k代表mzx这一天的爬山计划。x是作为起点的山峰的编号,a=0代表mzx会向左出发,a=1代表mzx会向右出发;b=0代表mzx要爬到第k个比起点低的山峰,b=1代表mzx要爬到第k个比起点高的山峰。
【输出】
输出mzx在第1到第m天爬到的那座山的编号,每个编号占一行。
如果不存在符合要求的山峰,输出 “-1”。
【输入输出样例】
T2.in |
T2.out |
5 3 4 1 3 10 2 0 0 2 1 1 1 2 1 0 1 5 2 |
-1 3 3 |
【数据范围】
1<=n,m<=5000
#include<iostream> #include<cstdio> using namespace std; int n,m,a[5050]; void init(){ cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; } int query1(int x,int k){ int cnt=0; for(int i=x-1;i>0;i--) if(a[i]<a[x]){ cnt++; if(cnt==k) return i; } return -1; } int query2(int x,int k){ int cnt=0; for(int i=x-1;i>0;i--) if(a[i]>a[x]){ cnt++; if(cnt==k) return i; } return -1; } int query3(int x,int k){ int cnt=0; for(int i=x+1;i<=n;i++) if(a[i]<a[x]){ cnt++; if(cnt==k) return i; } return -1; } int query4(int x,int k){ int cnt=0; for(int i=x+1;i<=n;i++) if(a[i]>a[x]){ cnt++; if(cnt==k) return i; } return -1; } void work(){ for(int i=1;i<=m;i++){ int a,b,x,k; cin>>a>>b>>x>>k; int ans; if(a==0){ if(b==0) ans=query1(x,k); else ans=query2(x,k); }else{ if(b==0) ans=query3(x,k); else ans=query4(x,k); } cout<<ans<<endl; } } int main(){ freopen("T2.in","r",stdin); freopen("T2.out","w",stdout); init(); work(); return 0; }
3.第三题
(T3.pas/c/cpp)
【问题描述】
lzh有这样的一个数字序列1234567891011121314151617181920……
lzh想向你询问这个序列的第n个数是多少。
【输入】
只有一个整数n。
【输出】
数字序列的第n个。
【输入输出样例1】
T3.in |
T3.out |
5 |
5 |
【输入输出样例2】
T3.in |
T3.out |
10 |
1 |
【数据范围】
对于30%的数据 保证1<=n<=100000000
对于100%的数据 保证 1<=n<=10000000000000000
#include<iostream> #include<cstdio> using namespace std; long long N,a,b,c; long long t1=0,t2=0,sum; int main(){ freopen("T3.in","r",stdin); freopen("T3.out","w",stdout); cin>>N; t1=10,t2=99; sum=9; int k=2; for(;N>=sum;k++){ N-=sum; sum=(t2-t1+1)*k; t2=t2*10+9; t1*=10; } k--; a=1; for(int i=2;i<=k;i++) a*=10; a+=N/k; b=N%k; if(b==0) a--,b+=k; c=k-b; for(int i=1;i<=c;i++) a/=10; cout<<a%10<<endl; return 0; }
这是文件输入输出的正确姿势。
友情提示:运行内存上限128MB代表所有所有变量个数不得超过大约三千万。计算机1s之内运算次数大约为100000000。
例如:int a[10]; 算10个变量