无聊的活动/缘生意转(2018 Nova OJ新年欢乐赛B题)解题报告
题目2(下面的太抓 我重新写了个背景 其他都一样)
无聊的活动
JLZ老师不情愿的参加了古风社一年一度的活动,他实在不觉得一群学生跳舞有什么好看,更不明白坐在身后的学生为什么这么兴奋(看小姐姐),于是露出了相当无聊+严肃的表情。
这不公平!因为他旁边的XBS老师是机器人!真正的XBS,在办公室里睡觉!
不过,他有一个艰巨的任务!那就是!做游戏!
这里的歌词有好多都带数字,比如“二十四桥明月不若此时节”、“三五各掌花灯盈盈各眉眼”,X老师把歌词翻译成英文,再由机器人筛选并翻译成阿拉伯数字。
现在机器人XBS会挑出含义为小于100的自然数的单词,并将答案加上该数。其余单词均表示0。
如果不这样做,机房的孩子就不能考试了!(╯‵□′)╯︵┻━┻
1 #include<cstdio> 2 #include<cstring> 3 #include<map> 4 #include<string> 5 #include<iostream> 6 #include<algorithm> 7 #include<ctime> 8 using namespace std; 9 int n,ans,len,val,list[10010][120]; 10 char s[22]; 11 char dic[120][22]={"one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen","twenty","twenty-one","twenty-two","twenty-three","twenty-four","twenty-five","twenty-six","twenty-seven","twenty-eight","twenty-nine","thirty","thirty-one","thirty-two","thirty-three","thirty-four","thirty-five","thirty-six","thirty-seven","thirty-eight","thirty-nine","forty","forty-one","forty-two","forty-three","forty-four","forty-five","forty-six","forty-seven","forty-eight","forty-nine","fifty","fifty-one","fifty-two","fifty-three","fifty-four","fifty-five","fifty-six","fifty-seven","fifty-eight","fifty-nine","sixty","sixty-one","sixty-two","sixty-three","sixty-four","sixty-five","sixty-six","sixty-seven","sixty-eight","sixty-nine","seventy","seventy-one","seventy-two","seventy-three","seventy-four","seventy-five","seventy-six","seventy-seven","seventy-eight","seventy-nine","eighty","eighty-one","eighty-two","eighty-three","eighty-four","eighty-five","eighty-six","eighty-seven","eighty-eight","eighty-nine","ninety","ninety-one","ninety-two","ninety-three","ninety-four","ninety-five","ninety-six","ninety-seven","ninety-eight","ninety-nine"}; 12 int check() 13 { 14 len=strlen(s),val=len+((s[0]-'a')<<3)+((s[len-1]-'a')<<7); 15 for(int i=1;i<=list[val][0];++i){ 16 for(int j=0;j<len;++j){ 17 if(s[j]!=dic[list[val][i]][j]) break; 18 if(j==len-1) return list[val][i]+1; 19 } 20 } 21 return 0; 22 } 23 void init() 24 { 25 for(int i=0;i<99;++i){ 26 len=strlen(dic[i]); 27 val=len+((dic[i][0]-'a')<<3)+((dic[i][len-1]-'a')<<7); 28 list[val][++list[val][0]]=i; 29 } 30 } 31 int main() 32 { 33 freopen("numstring10.in","r",stdin); 34 freopen("numstring10.out","w",stdout); 35 //int st=clock(); 36 init(); 37 cin>>n; 38 for(int i=1;i<=n;++i){ 39 scanf("%s",s); 40 ans+=check(); 41 } 42 cout<<ans<<endl; 43 //cout<<clock()-st; 44 return 0; 45 }
由于学校的评测机太过缓慢,这道当时唯一没有出锅的题出锅了,逼我不得不重新写了个更快的哈希。原来以字符串长度为分类来查找,现在是字符串长度+首字母+尾字母,本人已经尽力。
——————————分割线——————————
题目
写在前面
好像是网络问题导致我无法在电脑上看评测记录,不过根据wahacer dalao发来的截图……
这些画风清奇的打表已经完美诠释了什么叫暴力美学(噗)。
其实也没关系,因为本题的正解就是暴力+优hu化gao,由于要面向新高一同学就出的比较水(然而真相是我想不出来难题)。
正文
最初的想法是,把难点设在构造1-99的单词上,直接塞进map就做完了,了解一下构造方法。
1 #include<cstdio> 2 #include<map> 3 #include<ctime> 4 #include<string> 5 #include<iostream> 6 #include<algorithm> 7 using namespace std; 8 map<string,int>mp; 9 int n,ans; 10 string tmp; 11 char s[22]; 12 string I[110]={"","one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve"}; 13 string II[110]={"twen","thir","four","fif"}; 14 void trans(){if(tmp[0]=='e') tmp.erase(tmp.size()-1,tmp.size());} 15 void init() 16 { 17 for(int i=0;i<=12;++i) mp[I[i]]=i; 18 for(int i=13;i<=19;++i){ 19 tmp=(i<=15?II[i-12]:I[i-10]); 20 trans(); 21 mp[tmp+"teen"]=i; 22 } 23 II[2]="for"; 24 for(int i=2;i<=9;++i){ 25 tmp=(i<=5?II[i-2]:I[i]); 26 trans(); 27 tmp+="ty"; 28 mp[tmp]=i*10; 29 for(int j=1;j<=9;++j) mp[tmp+"-"+I[j]]=i*10+j; 30 } 31 } 32 int main() 33 { 34 //freopen("numstring10.in","r",stdin); 35 //int st=clock(); 36 init(); 37 cin>>n; 38 while(n--){ 39 scanf("%s",s); 40 tmp=string(s); 41 ans+=mp[tmp]; 42 } 43 cout<<ans<<endl; 44 //cout<<clock()-st; 45 return 0; 46 }
大致思路是把要用的部分打一个小小的表然后就可以构造十几和几十几的单词了,很简单吧。特别注意eighty的t要去掉一个(程序中的trans函数);构造“几十”之前把“four”变成“for”。(果然是考察小学英语)
不过鉴于很多高一的同学还没有学map,下面70分暴力先了解一下——
1 #include<cstdio> 2 #include<cstring> 3 #include<map> 4 #include<string> 5 #include<iostream> 6 #include<algorithm> 7 #include<ctime> 8 using namespace std; 9 int n,ans; 10 char s[22]; 11 char dic[120][22]={"one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen","twenty","twenty-one","twenty-two","twenty-three","twenty-four","twenty-five","twenty-six","twenty-seven","twenty-eight","twenty-nine","thirty","thirty-one","thirty-two","thirty-three","thirty-four","thirty-five","thirty-six","thirty-seven","thirty-eight","thirty-nine","forty","forty-one","forty-two","forty-three","forty-four","forty-five","forty-six","forty-seven","forty-eight","forty-nine","fifty","fifty-one","fifty-two","fifty-three","fifty-four","fifty-five","fifty-six","fifty-seven","fifty-eight","fifty-nine","sixty","sixty-one","sixty-two","sixty-three","sixty-four","sixty-five","sixty-six","sixty-seven","sixty-eight","sixty-nine","seventy","seventy-one","seventy-two","seventy-three","seventy-four","seventy-five","seventy-six","seventy-seven","seventy-eight","seventy-nine","eighty","eighty-one","eighty-two","eighty-three","eighty-four","eighty-five","eighty-six","eighty-seven","eighty-eight","eighty-nine","ninety","ninety-one","ninety-two","ninety-three","ninety-four","ninety-five","ninety-six","ninety-seven","ninety-eight","ninety-nine"}; 12 int check() 13 { 14 for(int i=0;i<99;++i){ 15 //int len1=strlen(s),len2=strlen(dic[i]); 16 //if(len1!=len2) continue; 17 for(int j=0;j<len1&&j<len2;++j){ 18 if(s[j]!=dic[i][j]) break; 19 if(j==len1-1) return i+1; 20 } 21 } 22 return 0; 23 } 24 int main() 25 { 26 //freopen("numstring10.in","r",stdin); 27 //int st=clock(); 28 cin>>n; 29 for(int i=1;i<=n;++i){ 30 scanf("%s",s); 31 ans+=check(); 32 } 33 cout<<ans<<endl; 34 //cout<<clock()-st; 35 return 0; 36 }
如果我们打表了但只写暴力查找就会被3e6的范围卡掉。
真·标程了解一下——
1 #include<cstdio> 2 #include<cstring> 3 #include<map> 4 #include<string> 5 #include<iostream> 6 #include<algorithm> 7 #include<ctime> 8 using namespace std; 9 int n,ans,len,list[22][120]; 10 char s[22]; 11 char dic[120][22]={"one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen","twenty","twenty-one","twenty-two","twenty-three","twenty-four","twenty-five","twenty-six","twenty-seven","twenty-eight","twenty-nine","thirty","thirty-one","thirty-two","thirty-three","thirty-four","thirty-five","thirty-six","thirty-seven","thirty-eight","thirty-nine","forty","forty-one","forty-two","forty-three","forty-four","forty-five","forty-six","forty-seven","forty-eight","forty-nine","fifty","fifty-one","fifty-two","fifty-three","fifty-four","fifty-five","fifty-six","fifty-seven","fifty-eight","fifty-nine","sixty","sixty-one","sixty-two","sixty-three","sixty-four","sixty-five","sixty-six","sixty-seven","sixty-eight","sixty-nine","seventy","seventy-one","seventy-two","seventy-three","seventy-four","seventy-five","seventy-six","seventy-seven","seventy-eight","seventy-nine","eighty","eighty-one","eighty-two","eighty-three","eighty-four","eighty-five","eighty-six","eighty-seven","eighty-eight","eighty-nine","ninety","ninety-one","ninety-two","ninety-three","ninety-four","ninety-five","ninety-six","ninety-seven","ninety-eight","ninety-nine"}; 12 int check() 13 { 14 len=strlen(s); 15 for(int i=1;i<=list[len][0];++i){ 16 for(int j=0;j<len;++j){ 17 if(s[j]!=dic[list[len][i]][j]) break; 18 if(j==len-1) return list[len][i]+1; 19 } 20 } 21 return 0; 22 } 23 void init() 24 { 25 for(int i=0;i<99;++i){ 26 len=strlen(dic[i]); 27 list[len][++list[len][0]]=i; 28 } 29 //for(int i=1;i<=20;++i) printf("%d %d\n",i,list[i][0]); 30 } 31 int main() 32 { 33 //freopen("numstring10.in","r",stdin); 34 //freopen("disappear.out","w",stdout); 35 //int st=clock(); 36 init(); 37 cin>>n; 38 for(int i=1;i<=n;++i){ 39 scanf("%s",s); 40 ans+=check(); 41 } 42 cout<<ans<<endl; 43 //cout<<clock()-st; 44 return 0; 45 }
打表的部分参考前一个程序,这里的优化是把字符串根据长度分类,这样只用查找相同长度的目标串,可以水到100,灵感来源于哈希值,这里的len==key(这道题顺便为没学哈希的同学打一点基础)。当然我也了解到可以用“-”作为分割线,这样查找范围变小了好多;然后好像有写strcmp胡搞过的(???)等等(不管啦 反正就是个暴力题)。
写在后面
第一次出题没有什么经验,而且比较水,搞了好久才弄完善。冬令营把题面搞出来,回家才学会出数据,这个解题报告就拖到开学了(中间还经历了一段痛苦不堪的补gan作业)。感谢Wahacer把最佳出题人赏赐给小的QAQ 有点承受不起啊(毕竟题这么水)……
12mango退役快乐~~~
转载于:https://www.cnblogs.com/12mango/p/8473650.html
无聊的活动/缘生意转(2018 Nova OJ新年欢乐赛B题)解题报告相关推荐
- 2018年数学建模国赛B题 智能RGV的动态调度策略
第一种情况大致思路: 每秒判断各个CNC的状态,若工作完成或者是出于空闲状态下则向RGV发出一个请求.同时,RGV每秒判断自己的状态(上下料.移动.闲置.清洗等),如果是处于闲置状态,则启用调度算法, ...
- 2018年数学建模国赛A题题目、解题思路、matlab代码(四)
题目: 消防和金属冶金等行业常常需要工作人员在高温环境中作业,高温作业专用服装可以较好地吸收部分热量,使得工作人员体表温度不至于过高从而避免灼伤,所以高温作业服必不可少.通常作业服由三层材料构成,记为 ...
- 洛谷ZHC邀请赛---2018年元旦马拉松欢乐赛之《我的一位程序员朋友》
emmmmmmmm 现在的时间是北京时间2018年1月2日凌晨2:09 一小时前我开始做这套题(T1在学校水过了) T1:开心农场 传送门:https://www.luogu.org/problemn ...
- [蓝桥杯]2018年第九届省赛真题C/C++ B组 填空+大题
第九届蓝桥杯省赛题目 填空A:第几天 填空B:明码 填空C:乘积尾零 填空 D: 测试次数(待学习) 填空 E:快速排序 大题F:递增三元组 大题G: 螺旋折线 大题H:日志统计 大题I-全球变暖 填 ...
- 2018 icpc 焦作站现场赛 E题题解
水题没人写题解,都直接上Java代码--那我写一个. 计蒜客题面:https://nanti.jisuanke.com/t/A2203 题意:如果i是完全平方数(>=4)的倍数,那么i号电阻的阻 ...
- 2018东南大学 SUS 十一欢乐赛 pwn解题记录
pwn2plus 直接栈溢出覆盖调用callsystem函数. exp from pwn import * #p = remote("47.100.40.190" , 10007) ...
- 【数学建模】2018年数学建模国赛C题 问题一代码
文章目录 问题一代码 导入包及数据 数据探索与预处理 会员统计分析 分析会员的年龄构成.男女比例等基本信息 分析会员的总订单占比,总消费金额占比等消费情况 分别以季度和天为单位,分析不同时间段会员的消 ...
- 2018年数学建模国赛B题
我们把问题分解,最终转化为求解路径规划问题--广义旅行商问题 针对广义旅行商问题这种NP难题,没有很好的可以求解出精确解的方法,比较常用的就是改良圈算法.动态规划和启发式求解算法.其中启发式求解算法主 ...
- 【数学建模】2018年数学建模国赛C题解答 基于RFMT 模型的百货商场会员画像描绘
文章目录 问题一 问题二 求出RFM数据 评分 K- Means聚类 问题三 问题四 问题五 参考文献 问题一 利用该大型百货商场提供的附件一中的会员信息以及附件三中的会员消费明细,完善该商场的会员画 ...
最新文章
- Winform中设置DevExpress的RadioGroup的items从配置文件中加载
- SAP Spartacus翻译 i18n - internationalization 的工作原理
- 闲鱼账号被封怎么办?解封看这里!
- Android系统换字体不root,一键换字体:字体大师
- Agile Web Application Development with Yii 1.1 and PHP5
- linux断网后自动重连,centos 空闲一段时间后自动断网
- 教程:使用Java以编程方式将PLT转换为PDF或图像
- svn服务器设置忽略文件夹,如何使用SVN忽略目录?
- 【强化学习】动态规划
- html5 数据库 视图,创建视图的sql语句是什么
- Android Material Design 系列之 BottomNavigationView + ViewPager + Fragment + BadgeView 开发详解
- 银河麒麟加完全自主的龙芯指令集,组合渡劫能否成功
- 使用f031的SPI单引脚(MOSI)+DMA实现WS2812B三色灯的级联控制
- docker部署环境
- 谈谈那些年玩RPG游戏时的疯狂举动
- 洛谷P1914题解——(本地测试AC但是交题爆零全WA)使用getchar();
- centos7 图形界面
- 【模拟 简易银行系统~python】
- Ouster激光雷达获取点云线数ring(通道)信息
- 神舟笔记本重装系统教程
热门文章
- Codeforces Round #637 (Div. 2) - Thanks, Ivan Belonogov! C. Nastya and Strange Generator
- 计算机信息的安全威胁包含( ),计算机信息系统存在的主要安全威胁不包括()
- 前端开发者的现代 C++ 课:JavaScript 与 C++ 的差异
- 大学物理第三版朱峰课后答案详解_大学物理答案(第三版)汇总
- 节流计划-基础知识-2-AIR724UG
- Unity VR中实现播放3D电影
- python排版工具
- c语言函数指针做解释器,自己动手写解释器(1):函数定义和调用
- 用配置文件配置数据源出现的access denied for user ‘root‘@这个问题的解决办法
- 对比一下年薪1万10万和100万的生活