2017 清北学堂 Day 6终极考试报告
预计分数: 100+70+70 = 240
实际假分数 : 40+80+70= 190 in cena(好吧不得不承认这个分数,,,,,,=.=)
实际真分数 : 100+80+100 = 280 in luogu.org
一句话:stl,cena害我一生,,,,,,
消失的数字(number)
Time Limit:1000ms Memory Limit:128MB
题目描述
rsy拥有n个数,这n个数分别是a1,a2,…,an。
后来出现了一个熊孩子zhw,用橡皮擦去了其中若干个数字,并且打乱了剩下的数字。rsy赶到现场后只剩下了m个数字b1,b2,…,bm,她想知道哪些数字被擦去了。
现在你需要告诉rsy被擦去的n-m个数是什么。
输入格式(number.in)
第一行一个数n,第二行n个数ai,表示一开始的数字。
第三行一个数m,第四行m个数bi,表示被擦去后的数字。
输出格式(number.out)
一行n-m个数,从小到大输出所有被擦去的数字。
输入样例
5
1 3 5 7 8
3
3 5 8
输出样例
1 7
数据范围
对于30%的数据n<=1000,ai与bi都是有序的。
对于60%的数据n<=100000,ai与bi都是有序的。
对于80%的数据n<=100000,ai,bi<=n。
对于100%的数据n<=100000,1<=ai,bi<=10^9。
一开始傻乎乎的以为这是一眼题,随手敲了个map+栈感觉肯定AC,然后敲了个vector的暴力开始对拍,各种极端极限数据都没问题
结果!!!!
我还是高估cena了....
60分的超时也是醉了。。。。
在洛谷上最慢的点才700ms,,,,,
╮(╯▽╰)╭,,认命,,,,
正确做法:把两个数组都从小到大排一遍然后在A里把B中出现过得元素都删掉就好
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<queue> 6 #include<stack> 7 #include<cmath> 8 #include<map> 9 using namespace std; 10 int n,m; 11 int p; 12 map<int,int>a; 13 int maxn=-1; 14 int ans[100001]; 15 int num=1; 16 int s[100001]; 17 int top=1; 18 int main() 19 { 20 //freopen("number.in","r",stdin); 21 //freopen("number.out","w",stdout); 22 scanf("%d",&n); 23 for(int i=1;i<=n;i++) 24 { 25 scanf("%d",&p); 26 a[p]=a[p]+1; 27 if(p>maxn)maxn=p; 28 s[top]=p;top++; 29 } 30 scanf("%d",&m); 31 for(int i=1;i<=m;i++) 32 { 33 scanf("%d",&p); 34 a[p]=a[p]-1; 35 } 36 int q=a.size(); 37 while(top!=0) 38 { 39 int p=s[top];top--; 40 if(a[p]!=0) 41 { 42 for(int i=1;i<=a[p];i++) 43 ans[num++]=p; 44 a[p]=0; 45 } 46 } 47 sort(ans+1,ans+num); 48 for(int i=1;i<=num-1;i++) 49 printf("%d ",ans[i]); 50 return 0; 51 }
龟速map+栈
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 using namespace std; 6 int n,m; 7 int a[100001]; 8 int b[100001]; 9 int num=1; 10 int main() 11 { 12 scanf("%d",&n); 13 for(int i=1;i<=n;i++) 14 scanf("%d",&a[i]); 15 scanf("%d",&m); 16 for(int i=1;i<=m;i++) 17 scanf("%d",&b[i]); 18 sort(a+1,a+n+1);sort(b+1,b+m+1); 19 for(int i=1;i<=n;i++) 20 { 21 if(a[i]==b[num]) 22 { 23 a[i]=0; 24 num++; 25 } 26 } 27 for(int i=1;i<=n;i++) 28 { 29 if(a[i]!=0) 30 { 31 printf("%d ",a[i]); 32 } 33 } 34 return 0; 35 }
AC
一道数论好题(math)
Time Limit:1000ms Memory Limit:128MB
题目描述
rsy最近在研究欧几里得算法,不会的同学可以去看下课件以及代码……
现在她想到了一个新的问题,求k个数的最大公约数!
事实上这个问题仍然很简单。所以rsy想强化一下,她觉得最大公约数等于1就不是很有趣了。因此她想在n个数中找最多的数,使得它们的最大公约数不等于1。
现在rsy想知道,能找最多多少个数。
输入格式(math.in)
第一行一个数n。
第二行n个数ai。
输出格式(math.out)
一个数表示答案。
输入样例
5
2 3 4 5 6
输出样例
3
数据范围
对于30%的数据n<=5。
对于50%的数据n<=20。
对于80%的数据n<=1000,ai<=1000。
对于100%的数据1<=n<=100000,1<=ai<=100000,数据几乎是随机的。
当我读完题立马就意思到- - > 骗分狗又要高兴咯=。=
为什么累?
因为这道题是让着求最大公约数
而偶数(也就是%2==0)是最普遍的最大公约数(因为自然数除了奇数就是偶数)
so 如果你能想到把%2==0的数的个数统计一下
那么恭喜你得到70分
但我还是没有这么不要脸滴
so我机智的选择用1000以内的素数筛(感觉自己更不要脸)
然而最后两个点一个莫名其妙的WA一个莫名其妙的TLE.......
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<queue> 6 #include<stack> 7 #include<cmath> 8 using namespace std; 9 int a[100001]; 10 int num=0; 11 int vis[100001]; 12 int tot[100001]; 13 int xx[100001]; 14 int js=0; 15 int main() 16 { 17 for(int i=2;i<=sqrt(100000);i++) 18 if(vis[i]==0) 19 for(int j=i*i;j<=100000;j=j+i) 20 vis[j]=1; 21 for(int i=1;i<=10000;i++) 22 if(vis[i]==0) 23 xx[++js]=i; 24 int n; 25 scanf("%d",&n); 26 for(int i=1;i<=n;i++) 27 { 28 int p; 29 scanf("%d",&p); 30 a[++num]=p; 31 } 32 for(int i=2;i<=js;i++) 33 { 34 for(int j=1;j<=num;j++) 35 { 36 if(a[j]%xx[i]==0) 37 tot[xx[i]]++; 38 } 39 } 40 int maxn=0; 41 for(int i=0;i<js;i++) 42 { 43 if(tot[xx[i]]>maxn) 44 maxn=tot[xx[i]]; 45 } 46 printf("%d",maxn); 47 return 0; 48 }
80分不知道哪儿错了的代码
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 int a[1000001]; 6 int main() 7 { 8 int n; 9 scanf("%d",&n); 10 for(int i=1;i<=n;i++) 11 { 12 int p; 13 scanf("%d",&p); 14 a[p]++; 15 } 16 int ans=-1; 17 for(int i=2;i<=100000;i++) 18 { 19 int maxnnow=0; 20 for(int j=i;j<=100000;j=j+i) 21 maxnnow+=a[j]; 22 if(maxnnow>ans) 23 ans=maxnnow; 24 } 25 printf("%d",ans); 26 return 0; 27 }
AC
扫雷(mine)
Time Limit:1000ms Memory Limit:128MB
题目描述
rsy最近沉迷于一款叫扫雷的游戏。
这个游戏是这样的。一开始网格上有n*m个位置,其中有一些位置有雷。每次rsy可以左键点击一个方块,此时若这个方块是雷,则rsy被炸,游戏结束,否则如果这个位置周围8格有x个雷,则会显示数字x。特别地,当x=0时,系统会自动左键点击附近8个位置。(此时附近8个位置一定没有雷,假如附近8个位置仍存在x=0,则继续往外扩展)想要更进一步获得关于题目的信息,打开程序->附近->游戏->扫雷或者直接打开下发的可执行文件。
或者rsy右键点击一个位置,标注这个位置是雷。
不幸的是,她鼠标不能左右键同时点击,因此只需考虑她左键点击与右键点击就可以了。
注意游戏胜利的条件是所有非雷的位置都被左键点击到。(特别地,当一开始时n*m个位置都是雷时,LYK自动获得胜利)
rsy从网上下载了金手指,很轻易地就掌握了所有雷所在的位置。rsy想通过最少的点击次数获得胜利(这里的点击次数不包括系统自动点击)。于是他来请求你的帮助。
输入格式(mine.in)
第一行两个数n,m。
接下来n行,每行m个数ai,j,表示这个矩阵。若ai,j=’*’则表示这个位置是雷,若ai,j=’.’则表示不是雷。
输出格式(mine.out)
一个数表示答案。
输入样例
3 3
..*
...
..*
输出样例
2
对于30%的数据n=1;
对于另外20%的数据n,m<=3;
对于再另外20%的数据*大致占矩阵的2/3且数据随机。
对于100%的数据n,m<=1000。
Hint:
适度游戏益脑,沉迷游戏伤身。ok
一开始看这题还是有些懵逼的,但是手动过了一把扫雷之后就明白了
只要照着0一顿乱点就可以了呗。。。
然而!!!!
因为搜索需要,我机(tou)智(lan)的开了4个queue队列,
结果,,,,
最后三个点超时。。。。。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<queue> 6 #include<stack> 7 #include<cmath> 8 using namespace std; 9 int n,m; 10 int a[1001][1001]; 11 int vis[1001][1001]; 12 char p; 13 int xx[10]={-1,+1,0,0,-1,-1,+1,+1}; 14 int yy[10]={0,0,-1,+1,-1,+1,-1,+1}; 15 queue<int>qx; 16 queue<int>qy; 17 int ans=0; 18 void deal(int nowx,int nowy) 19 { 20 queue<int>needx; 21 queue<int>needy; 22 needx.push(nowx); 23 needy.push(nowy); 24 while(needx.size()!=0&&needy.size()!=0) 25 { 26 int nowneedx=needx.front();needx.pop();//当前为0的元素 27 int nowneedy=needy.front();needy.pop(); 28 for(int i=0;i<8;i++) 29 { 30 int wx=nowneedx+xx[i]; 31 int wy=nowneedy+yy[i]; 32 if(wx>=1&&wx<=n&&wy>=1&&wy<=m) 33 { 34 if(a[wx][wy]==0&&vis[wx][wy]==0) 35 { 36 needx.push(wx); 37 needy.push(wy); 38 } 39 vis[wx][wy]=1; 40 } 41 42 } 43 } 44 45 } 46 int main() 47 { 48 scanf("%d%d",&n,&m); 49 for(int i=1;i<=n;i++) 50 for(int j=1;j<=m;j++) 51 {cin>>p; if(p=='*') a[i][j]=438;} 52 for(int i=1;i<=n;i++) 53 { 54 for(int j=1;j<=m;j++) 55 { 56 for(int k=0;k<8;k++) 57 { 58 if(a[i][j]!=438&&a[i+xx[k]][j+yy[k]]==438&&i+xx[k]>=1&&i+xx[k]<=n&&j+yy[k]>=1&&j+yy[k]<=m) 59 a[i][j]++; 60 } 61 if(a[i][j]==0&&vis[i][j]==0) 62 {qx.push(i);qy.push(j);vis[i][j]=1;} 63 } 64 } 65 memset(vis,0,sizeof(vis)); 66 while(qx.size()!=0&&qy.size()!=0) 67 { 68 int nowx=qx.front();qx.pop(); 69 int nowy=qy.front();qy.pop(); 70 if(vis[nowx][nowy]==0) 71 { 72 ans++; 73 vis[nowx][nowy]=1; 74 deal(nowx,nowy); 75 } 76 } 77 for(int i=1;i<=n;i++) 78 { 79 for(int j=1;j<=m;j++) 80 { 81 if(vis[i][j]==0&&a[i][j]!=438) 82 ans++; 83 } 84 } 85 printf("%d",ans); 86 return 0; 87 }
开了4个queue不想改反正在洛谷AC的代码
总结:这次考试终于发挥出真正水平了,但成绩仍然一般,,。,。虽然原因很多吧,但是也反映出了我的很多弱点:
1.思路太窄,第一题明明可以想到O(n*m)的做法,但是自己还是明知map慢偏用map做,其实有时候完全可以不用使劲照着一种思路走到死胡同,说不定换个角度就是海阔天空呢?
2.对极限和极端数据的分析不够深入,特别是在写对拍的时候,一定不要只注意程序在极限数据的结果,必须要先确保程序的运行时间在允许范围之内!
2017 清北学堂 Day 6终极考试报告相关推荐
- 2017清北学堂(提高组精英班)集训笔记——基础算法
我这更新笔记的顺序有点乱时间也很乱,见谅,(其实我是想偷懒什么简单先更什么O(∩_∩)O~) 一.倍增算法: 定义:用f[i][j]表示从i位置出发的2j个位置的信息综合(状态) 一个小小的问题:为什 ...
- 2017清北学堂(提高组精英班)集训笔记——图论
我们进入一个新的模块--图论! emmmmm这个专题更出来可能有点慢别介意,原因是要划的图和要给代码加的注释比较多,更重要的就是...这几个晚上我在追剧!!我们的少年时代超级超级超级好看,剧情很燃啊! ...
- 2017国庆 济南清北学堂 8天乐
Day 0 想吐槽济南的堵车 大约接近4点从莱芜走的,走高速一个多小时,5点左右就到了济南,但是因为济南的堵车,下班高峰期,用了两个多小时才到了我们的目的地.好不容易到宾馆登记了,mc还要我们开会,8 ...
- 2020清北学堂秋季营感想——Hoarfrost
2020清北学堂秋季营感想 前言:九月三十日放假以后,就马不停蹄地开始了这一次的奥赛培训.原先参加过暑假的提高组腾飞营,当时第一场模拟赛拿了第一,便觉得CSP的题目难度不会很高,普及+/提高-左右的难 ...
- 清明培训 清北学堂 DAY1
今天是李昊老师的讲授~~ 总结了一下今天的内容: 1.高精度算法 (1) 高精度加法 思路:模拟竖式运算 注意:进位 优化:压位 程序代码: #include<iostream> #i ...
- 【十一日记】 清北学堂酱油记
Day 0 五点起床 困~ 喜闻乐见的六点集合 嗯我们出发的时候迟到了四分钟( 06:26 第一次出去怎么多人 啧啧啧 @57的熊孩子们好多啊qwq 十分钟到一中 果然老司机233 嗯 目睹他们放学吃 ...
- 清北学堂 2017-10-07
********今天得了在清北的最高分,有点开心wwwww,mjy爱您! 树 [问题背景] zhx 是二叉查找树大师. [问题描述] 二叉查找树是一种特殊的二叉树(每个节点最多只有两个儿子的树 ...
- 清北学堂day1考试
probA 小 N 最近在沉迷数学问题. 对于一个数字串 S,如果可以将它划分成两个数字 A.B,满足: 1. S ̅=(AB) ̅ .(就是分割的时候,前面的串为A,后面的为B) 2. A.B 均不 ...
- 洛谷P2258 子矩阵[2017年5月计划 清北学堂51精英班Day1]
题目描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵. 例如,下面左图中选取第2.4行和第2.4.5列交叉位置的元素 ...
- 2018.6清北学堂day6考试
T1 给定一个n和k,求可爱数字的个数 其中可爱的数字满足 {sKi}>SKn { s K i } > S K n \{ \frac{s}{K^i}\} > \frac{S}{K^n ...
最新文章
- 浅析SQL Server数据修复命令DBCC的使用
- CMake编译Makefile
- 基于intellij和meavn的整合开发struts2框架的web程序
- 1105 Spiral Matrix (25 分)【难度: 一般 / 知识点: 模拟】
- C# 连接SQLServer数据库及登录验证知识
- yum安装openoffice
- 项目启动居然如此重要!
- PostgreSQL学习总结(6)—— PostgreSQL 模式(SCHEMA)详解
- QT--编写自己的TCP/IP上位机软件--demo
- 收集的Word2007技巧大全
- JDK动态代理简单实现
- android 地址json文件,Android访问assets本地json文件的方法
- 《商业的本质》读书笔记
- catia二次开发招标_CATIA二次开发
- IDEA设置版权信息
- qq象棋辅助 android,天天象棋攻略助手安卓版
- 天下无贼是假的,天下无票倒是真的;如来神掌是假功夫,能买到车票才是真功夫。
- 层次聚类sklearn.cluster包AgglomerativeClustering
- wps office 2005:不得不用的14绝技
- vs按f5没反应_NBA直播:灰熊vs火箭 死亡五小战过关斩将,本战势在必得
热门文章
- 3DMAX导出插件编写(续)
- 产品经理需要了解的宏观趋势(共享经济专题)1/7
- CKeditor 3.1 精简版带SyntaxHighlighter插件
- 【前沿技术RPA】 一文学会用UiPath实现自动发送电子邮件(Email Automation)
- 量子物理史话 第四章 白云深处
- 用计算机语言写结婚祝福语,[结婚电子显示屏祝福语]电子显示屏结婚贺词
- android 手机本地(office、word)文件预览
- 创建mysql对象_mysql创建statement对象
- windows x64和x86区别
- 计算机内存不足16g内存,加装16G内存,电脑却运行卡顿、崩溃?原来是这项设置有问题!...