经过漫长的4个多月的信息奥赛学习,对于我这么一个曾经从未接触过编程的人来说,已经是有很大的进步了(其实很少..),所以我在此对四个月的信奥编程学习进行总结与归纳:
一.了解了什么是信息奥赛
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。(省略N字)也就是NOIP啦,毕竟玩这个也不光光是为了得奖(能得最好)
二.学会一些基本的算法:
1.基础算法:主要是基本的对库的调用(我只会用万能库O(∩_∩)O~),对一些基本的格式的运用,主要包括一些基本的输入输出,如cin,cout,scanf,printf等等,一些运算基础,如x++,x+=2,x/(x-1)等等;如简单A+B代码:
-
#include<bits/stdc++.h>//调用这个万能库 using namespace std; int main() { int a,b;//定义两个字母a,b; cin>>a>>b;//输入这两个字母a,b; cout<<a+b<<endl;//输出a+b的和,endl指换行; return 0;//结束; }
2.if语句:额。。这个没什么好说的,主要就是两个语句:if(如果怎么样怎么样){就怎么样怎么样}以及else(不然){就怎么样怎么样}。如判断奇偶数:
-
#include<bits/stdc++.h> using namespace std; int main() { int x; cin>>x; if(x%2==0)//如果输入的X除以2的余数为0; cout<<"Even"<<endl;//输出Even; else//不然; cout<<"ODD"<<endl;//输出ODD; return 0; }
3.循环:这个我能讲10节课,因为后面的基本所有的算法和各种各样的题解,基本上都用到循环,主要有for循环,语句是:for(执行的语句),每执行一次,接下来的内容中就会循环一次,有大大的用途,例如,数组的输入输出,字符串的各个字母的循环等等。还有他的孪生兄弟while语句,即:while(执行的语句)这个与for语句差不多,只要满足括号内的语句,系统就会自动进行循环,一旦不满足,系统会自动停下来。还有一个配套的break,用来在满足某个语句时直接跳出循环。以及各种循环套循环,循环NN次等等。最简单的循环如简单累加和:
-
#include<bits/stdc++.h> using namespace std; int main() { int a,ans; cin>>a; for(int i=1;i<=a;i++)//定义一个字母I,开始赋值为1,每次增加1,直到它的值与a相等时停止; { ans=ans+i;//ans每次加上i的值,即为从1~a之间的每一个数; } cout<<ans<<endl; return 0; }
4.数组:一维数组说简单了就是一大串数,用一个字母(或几个字母,自由定义)后面加一对中括号,中括号内是一个数字,在定义时,数字代表定义的数组的个数,在进行各种语句调用是,这个数字代表的是某个数组,即Int a[100]是代表定义100个数组,a[100]=0是代表把0赋值道第100的a数组中,两者代表的含义不同。二维数组也差不多,如果把一维数组看成是一根直绳上的一串数字,那么二维数组就是工工整整的写在一张白纸上的数字,定义和表示的方法也和一维数组差不多,只不过后面用到了两对中括号。字符数组,顾名思义,也就是存储字母或符号的数组,如char a[10];即使在数组a中存储数量不超过10的一串字符。数组用的就比较多了,如倒序输出:
-
#include<bits/stdc++.h> using namespace std; int main() { int a,b[10000];//定义数组B,个数为10000个; cin>>a; for(int i=1;i<=a;i++) { cin>>b[i];//每次都输入第I个数组; } for(int j=a;j>=1;j--)//注意:这里是从a开始,每次减1,直到j等于1; { if(j!=1) { cout<<b[j]<<' ';//输出第j个b数组,后面带空格; } if(j==1) { cout<<b[1];//输出第一个b数组,后面不带空格; } } return 0; }
5.函数:有意思的东东,函数我一般使用bool来定义,定义后的函数可以在运算中运用,开始定义好,可以省下不少的步骤,用于减少时间复杂度,如下代码中,运用函数做到了缩短时间,避免超时的作用(再求素数):
-
#include<bits/stdc++.h> using namespace std; bool hh(int n)//定义一个函数,函数名为hh。运用时会输入一个值N; { for(int i=2;i*i<=n;i++) if(n%i==0)//如果N除以i的余数为0 { return 0;//返回的值为0 } return 1;//即如果返回值不为零,返回1 } int main() { int n; cin>>n; for(int j=2;j<n;j++) { if(hh(j))//调用函数hh,如果j满足条件(即为返回值为1),就输出j; cout<<j<<endl; } return 0; }
三.各种杂七杂八的算法
1.贪心:说简单了,就是尽可能的求最赚钱的方法。语言比较难以形容,具体看智力大冲浪的代码。在这之前请允许我描述一下题目:小伟报名参加了智力大冲浪电视节目,该节目开始给玩家N元钱(当然不会让你全拿走),接下来布置了M个小游戏,每个小游戏都必须在规定的时间内完成,不然会扣钱,但是不会让玩家赔钱。代码:
-
#include<bits/stdc++.h> using namespace std; struct xxx{ long shijian,qian; }a[500];//定义结构体; bool cmp(xxx x,xxx y) { return x.qian>y.qian; }//定义函数; int main() { int a1,b,c; bool d[1000]={}; cin>>a1>>b; for(int i=1;i<=b;i++) cin>>a[i].shijian;//输入每次游戏的规定时间; for(int j=1;j<=b;j++) cin>>a[j].qian;//输入每次游戏完不成所扣的钱; sort(a+1,a+b+1,cmp);//将规定的时间从大到小排序; for(int k=1;k<=b;k++) { c=a[k].shijian; while(d[c]>0&&c>0) c--; if(c>0) d[c]=1; else a1-=a[k].qian; } cout<<a1<<endl; return 0; }
四.暂时结束:好吧,我能玩的转的也就这么点点东东,2017的四个月也不能说完全没有收获,收获还是有的,但是没有到达期望,希望2018我能更加努力,更上一层楼!
(不得不说这篇是真的又臭又长)