没有合适的资源?快使用搜索试试~ 我知道了~
NOIP普及组 复赛2016-2011 解答.doc
需积分: 13 0 下载量 50 浏览量
2020-11-19
19:10:17
上传
评论
收藏 228KB DOC 举报
温馨提示
试读
40页
NOIP普及组 复赛2016-2011 解答.doc
资源推荐
资源详情
资源评论
NOIP 普及组 复赛 历年 试题
2018 年 03 月 13 日 08:44:30mrcrack阅读数:858
NOIP 普及组 复赛 历年 试题
NOIP2016普及组 复赛 试题
https://wenku.baidu.com/view/
c317cd8abdeb19e8b8f67c1cfad6195f312be89f.html?
rec_flag=default&mark_pay_doc=2&mark_rec_page=1&mark_rec_position=2&mark
_rec=view_r_1&clear_uda_param=1 可见试题
1.买铅笔
https://www.luogu.org/problemnew/show/P1909 可提交测评
//P1909 买铅笔
//模拟样例 1
//57%2!=0 (57/2+1)*2=58
//57%50!=0 (57/50+1)*30=60
//57%30!=0 (57/30+1)*27=54
//该题是纯模拟的水题,重心在整数的整除,取余,找最值。
//有一个疑虑,int 是否会溢出
//试算了一下,10000/1*10000=10^8 即需求 10000 只笔,每包 1 只,每只花费
10000,故总花费 10000/1*10000=10^8,没有溢出
//同时也确定了,min 初始化要求 min>10^8
//为了拿 100 分,分析还是挺关键的。
//样例通过,信心满满,但还有些忐忑,提交,哇 20 个测试点,结果 AC 2018-3-13
#include <stdio.h>
int main(){
int n,a,b,c,min=999999999,i;
scanf("%d",&n);
for(i=1;i<=3;i++){
scanf("%d%d",&a,&b);
if(n%a!=0)c=(n/a+1)*b;//不能整除
else c=n/a*b;//能整除
if(c<min)min=c;
}
printf("%d",min);
return 0;
}
2.回文日期
https://www.luogu.org/problemnew/show/P2010 可提交测评
//P2010 回文日期
//看了日期表示方式,发现正是自己平时常用的表示方式,心定了,题目读得进
//回文,发现平时也有联系
//平年,闰年,平时也有写过
//该题,将功能函数一个个编出,整合是关键
//思考如下,1 将两个日期之间所有整数取出,进行回文判定,发现 10^8,有超时的风
险
//2 将两个日期之间的符合条件的日期取出,进行回文判定,2000*365=7*10^5 不会超
时
//写得过程中,发现第一年,最后一年需特殊处理
//建议,编写一个功能,测试一次,以防最后抓狂
//该题考点,分析出某个数的各个位置的值,字符串简单处理,整数取余
//样例通过,提交 AC。该题要求 程序代码 编写要比较熟练。 2018-3-13
//该题编写,新手耗时估计 1 小时
#include <stdio.h>
int y[3],m[3],d[3],a[3],c[]={0,31,0,31,30,31,30,31,31,30,31,30,31},cnt=0;
char s[10];
int date(int a[]){//根据 日期 解析出年 月 日 ,编的过程中,发现设想的难点:前导 0 没
有出现
int i;
for(i=0;i<2;i++){
y[i]=a[i]/10000,a[i]%=10000;
m[i]=a[i]/100,a[i]%=100;
d[i]=a[i];
}
}
int year(int a){//闰年判定,1 闰年 2 非闰年
if(a%100==0)//整百年处理
if(a%400==0)return 1;//闰年
else return 0;
else if(a%4==0)return 1;
else return 0;
}
int check(int a){//判断回文,1 是,2 否
int len=0,i;
while(a)s[len++]=a%10+'0',a/=10;//将日期解析成字符串
for(i=0;i<len/2;i++)
if(s[i]!=s[len-1-i])return 0;
return 1;
}
int main(){
int i,j,k,b;//b 新的日期
scanf("%d%d",&a[0],&a[1]);
date(a);
for(j=1;j<=12;j++){//生成 月 第一年处理
if(j==2)//2 月单独处理
if(year(y[0]))c[j]=29;//闰年
else c[j]=28;//非闰年
for(k=1;k<=c[j];k++){//生成 日
b=10000*y[0]+j*100+k;
if(check(b))cnt++;
}
}
for(i=y[0]+1;i<y[1];i++)//生成 月 日
for(j=1;j<=12;j++){//生成 月
if(j==2)//2 月单独处理
if(year(i))c[j]=29;//闰年
else c[j]=28;//非闰年
for(k=1;k<=c[j];k++){//生成 日
b=10000*i+j*100+k;
if(check(b))cnt++;
}
}
if(y[1]!=y[0])//如果没有样例 1,这点容易忽略
for(j=1;j<=12;j++){//生成 月 最后一年处理
if(j==2)//2 月单独处理
if(year(y[1]))c[j]=29;//闰年
else c[j]=28;//非闰年
for(k=1;k<=c[j];k++){//生成 日
b=10000*y[1]+j*100+k;
if(check(b))cnt++;
}
}
printf("%d",cnt);
return 0;
}
3.海港
https://www.luogu.org/problemnew/show/P2058 可提交测评
//P2058 海港
//看了一眼数据范围,算法复杂度不能是 O(n^2),而 O(nlogn) 比较合适
//题目配上说明,题意还是很清楚的
//看了题目的测试点,朴素算法,还是能得 70 分
//仔细想想,该题属于线性序列处理,适用的方法,链表,单调栈,单调队列,树状数
组,线段树
//再仔细想想,有单调性的数据,基本可用 单调队列
// 1≤n≤10^5 ∑ki≤3*10^5 困惑比较大,如何处理,内容容易溢出
//P2058 海港
//突然间想到,用前缀和更能优化
//q[100100] sum[1010]提交 MLE
//q[10010] sum[1010]提交 70 分,测试点 7-11,13 RE 很满意 2018-3-30 21:23
//以下代码为 70 分代码
//从 70 分跨越到 100 分,估计要改算法,想不下去了,考虑看看题解
//https://blog.csdn.net/c20190102/article/details/53761648 此文代码写得不错
//看了看,算法的区别在于,应选人为研究对象,而不是选船为研究对象,不过,一开
始没想到,之后也确实想不到
//从上述角度,还是说明,算法确实不同
//样例通过,提交 AC 2018-3-31 17:14
#include <stdio.h>
#include <string.h>
struct node{
int time;
int x;
}q[300100];//人
int h,t,vis[100100];
int main(){
int n,time,k,i,x,cnt=0;//此处写成 int n,time,k,i,x,cnt; 忘记将 cnt 初始化
memset(vis,0,sizeof(vis));
scanf("%d",&n);
h=t=1;
while(n--){
scanf("%d%d",&time,&k);
while(h<t&&q[h].time+86400<=time){
vis[q[h].x]--;
if(!vis[q[h].x])cnt--;//像不像 欧拉图 的计算
h++;
}
for(i=1;i<=k;i++){
scanf("%d",&x),q[t].time=time,q[t].x=x,t++;
if(!vis[x])cnt++;
vis[x]++;//有点像 欧拉图 的计算
}
printf("%d\n",cnt);
}
return 0;
}
//以下代码为 70 分代码,仅供参考
//P2058 海港
//突然间想到,用前缀和更能优化
//q[100100] sum[1010]提交 MLE
//q[10010] sum[1010]提交 70 分,测试点 7-11,13 RE 很满意 2018-3-30 21:23
//以下代码为 70 分代码
#include <stdio.h>
#include <string.h>
struct node{
int time;
int k;
int sum[1010];//此处开多少,没有把握
}q[10010];
int h,t;
int main(){
int n,time,k,i,j,cnt;
memset(q,0,sizeof(q));
scanf("%d",&n);
h=t=1;
while(n--){
scanf("%d%d",&time,&k),q[t].k=k,q[t].time=time;
while(h<t&&q[h].time+86400<=time)h++;//此处写成
while(h<t&&q[h].time+86400>=time)h++;查了好久
for(i=1;i<=k;i++)scanf("%d",&j),q[t].sum[j]=1;
for(j=1;j<=1000;j++)q[t].sum[j]+=q[t-1].sum[j];
t++;
cnt=0;
for(i=1;i<=1000;i++)
if(q[t-1].sum[i]-q[h-1].sum[i])cnt++;
printf("%d\n",cnt);
}
return 0;
}4.魔法阵
https://www.luogu.org/problemnew/show/P2119 可提交测评
//P2119 魔法阵
//https://blog.csdn.net/c20181503csy/article/details/53319238 此文写得比较粗
//https://blog.csdn.net/c20182030/article/details/53289443 此文写得比较细
//可两篇文章,结合起来看
//需用到桶排序+排列组合知识
//样例通过,提交 AC 2018-4-5 12:54
#include <stdio.h>
#include <string.h>
#define maxn 15100
#define maxm 40100
#define LL long long
LL w[maxn],h[maxm],a[maxn],b[maxn],c[maxn],d[maxn];//h[i] i 存储物品序号 h[i]
为物品魔法值 w[i]中 i 为魔法值,w[i]表示魔法值为 i 的物品个数 a[i]中 i 为魔法值 a[i]为该魔
法值对应魔法阵的使用次数
LL n,m;
LL min(LL a,LL b){
return a<b?a:b;
}
LL max(LL a,LL b){
return a>b?a:b;
}
int main(){
LL i,j,x,y,min_n=16000,max_n=-1;
memset(w,0,sizeof(w));
scanf("%lld%lld",&n,&m);
for(i=1;i<=m;i++)scanf("%lld",&h[i]),w[h[i]]+
+,min_n=min(min_n,h[i]),max_n=max(max_n,h[i]);//此处做了优化,找出魔法值的最小
值 min_n,最大值 max_n,之后整个程序运行时间缩短了一半
for(i=1;9*i<max_n-min_n;i++){//间距最小从 1 开始,自加,max_n-min_n 是魔法值
之间的最大间距
x=9*i+1,y=0;//x=9*i+1 是 a d 之间的最小间距
剩余39页未读,继续阅读
资源评论
gmsz999
- 粉丝: 0
- 资源: 35
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 高等数学第一章第二节数列的极限
- Python 版冒泡排序算法源代码
- tensorflow-gpu-2.7.2-cp38-cp38-manylinux2010-x86-64.whl
- tensorflow-2.7.3-cp39-cp39-manylinux2010-x86-64.whl
- tensorflow-2.7.2-cp39-cp39-manylinux2010-x86-64.whl
- Python版本快速排序源代码
- Python 语言版的快速排序算法实现
- 450815388207377安卓_base.apk
- 超微主板 X9DRE-TF+ bios 支持 nvme启动
- 基于Python通过下载气象数据和插值拟合离散数据曲线实现对寒潮过程的能量分析
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功