狂刷OJ基础题两天,OJ机考成功半小时全部AC了
Posted adventure.Li
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了狂刷OJ基础题两天,OJ机考成功半小时全部AC了相关的知识,希望对你有一定的参考价值。
一、背景
我们学校有个程序设计实践(C\\C++版),成绩就是平时给了54题刷够50+就平时分满分,期末考试就是上机考试八题(大概分为数论、简单计算、时间显示、进制转换、字符串、递归、枚举几大类型),只要能够全部AC则可满分。
二、总结
- 心得感悟
一定多
刷题,而注重基础
;如果有基础,考前也得刷刷熟悉熟悉(本人就是考前两天,连续刷了大概五十道基础题吧,我走的时候看了看榜单在我前面几个都是平时刷题上百道的,平时榜单前面的人,所以说千万要动手敲敲)虽然对于一个大三的老油条去考人家大一的OJ在线考试,但是如果不注重基础很容易不能够全部AC。
下面大概是用devc++刷了一整天从 10点到晚上1点左右的记录,有时会卡顿,可能一直不对,但是没有关系,再返回来读题看是不是理解错误题意了,或者看看输出是否有问题格式。
- 对于明年需要参加类似考试的朋友们,给以下建议
对于刚学习的朋友来说,可能最大的困难在于语言的学习;因此对于大一的朋友一定先把
语言基础打牢
,弄清C语言中 函数复用,数组存储 循环计算这三大法宝
,然后了解学习高级用法比如说string字符串,结构体,指针,vector,map stl类
这些结构会为你省不少事儿,最后再了解algorithm、math包的一些库函数。当你把工具使用熟练之后,就可以开始按照一下步骤去刷题。
进制转换
基本策略:对于转十进制的数,可以string存储非十进制数,然后遍历字符串,按字符串的位子权重进行累加即可。对于超出十进制使用A、B来代表10,11的解决办法
巧妙利用ASCII码建立hash数组映射, 或者直接map映射即可
。
对于十进制转其他进制,采用取余,整除即可。模板如下
int toTen(string val,int curScale){
int res=0;
int curVal=1;//对应权重
for(int i=val.length()-1;i>=0;i--){
if(val[i]-'0'>=curScale)
return -1;
res+=(val[i]-'0')*curVal;
curVal*=curScale;
}
return res;
}
string map[16]={"1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};
// 任意型转10 使用string
// 10转任意使用%,/
void handle(int p,int q,string r){
// p当前进制,q目标进制
int curVal = toTen(r,p);
string res="";
while(curVal){
int temp = curVal%q;
res=map[temp-1]+res;
curVal/=q;
}
cout<<res<<endl;
}
简单计算
基本策略:处理分析问题,基本上使用数组循环即可解决,如
开灯问题、校门外的树等
,另外巧妙使用printf()格式控制处理保留小数问题。(也属于数学问题)
数论
基本上了解gcd、lcm、素数问题即可了。
字符串
掌握find()、length()、s[i]取个字符串(char型),+进行拼接即可。巧妙利用ASCII进行与数的转换 真的十分好用。
出题类型:统计单词数量(遍历判断)、子串匹配问题(模式匹配)
时间显示
策略:先计算得出天数,然后按照计算星期几(%7循环取余),年月日这样去推。注意处理闰年问题。
// P1022 日历问题2
// 已知 2007 年 10 月 10 日,请求出 nn 天后是几月几号
// 11:33开始
// 11:34去上厕所
// later....
// 12:18继续
// 12:34初版
#include"iostream"
using namespace std;
// 年月日的进行处理
int reapYear(int y){//判断是否闰年
if( y%400==0 || y%4==0&&y%100!=0 ){
return 1;
}
return 0;
}
int yearMap[2]={365,366};
int monthMap[2][12]={31,28,31,30,31,30,31,31,30,31,30,31,
31,29,31,30,31,30,31,31,30,31,30,31 };
void handle(int n){
int year=2007,month=10,day=10;
while(n>=yearMap[reapYear(year)])
{
n-=yearMap[reapYear(year)];
year++;
}
while(n>=monthMap[reapYear(year)][month-1]){
n-=monthMap[reapYear(year)][month-1];// map映射
month++;
if(month==13){// 越界问题考虑
month=1;
year++;
}
}
if(day+n>monthMap[reapYear(year)][month-1]){
day = day+n-monthMap[reapYear(year)][month-1];
month++;
if(month==13){
month=1;
year++;
}
}else{
day=day+n;
}
// 格式问题
// if(month<10&&day<10){
// cout<<year<<"-0"<<month<<"-0"<<day<<endl;
// }else if(month<10){
// cout<<year<<"-0"<<month<<"-"<<day<<endl;
// }else if(day<10){
// cout<<year<<"-"<<month<<"-0"<<day<<endl;
// }else{
// cout<<year<<"-"<<month<<"-"<<day<<endl;
// }
printf("%d-%02d-%02d\\n",year,month,day);// 格式输出
}
void hanlde2(int n){
// //dayofweek=days%7;
//
// for(int i=2007;n>=year[leapyear(i)];i++)
// n-=year[leapyear(i)];
// for(j=0;days>=month[leapyear(i)][j];j++)
// n-= month[leapyear(i)][j];
//
// printf("%d-%02d-%02d %s\\n",i,j+1,n+1);//,week[dayofweek]
}
int main(){
int n;
// while(cin>>n){
// handle(n);
// }
for(int i=1;i<=2000;i++)
handle(i);
return 0;
}
大数问题
数组存储,然后进行计算,处理进位借位问题,再考虑边界问题。此类问题可以分为加减乘除以及N阶乘(再分麦粒问题)。
递归问题
掌握斐波那数类型(爬楼梯,青蛙过河)、汉诺塔、放苹果(两个参数)、划分曲线常见类型即可。
最后,我将简单计算、时间显示、进制转换、高精度、字符串、枚举、递归的部分OJ题以及OJ入门学习PPT上传到网盘,需要的朋友可以下载学习参考。
链接:https://pan.baidu.com/s/1lYhzIe5xvVbx6HjmO_p_Gg
提取码:1213
复制这段内容后打开百度网盘手机App,操作更方便哦–来自百度网盘超级会员V4的分享
以上是关于狂刷OJ基础题两天,OJ机考成功半小时全部AC了的主要内容,如果未能解决你的问题,请参考以下文章