首页 > 代码库 > 【正常向】CODEVS上分黄金
【正常向】CODEVS上分黄金
白银上分黄金失败=。=
在之前有很认真的写了一波排序,所以排序并不是很怂,还是那个理,现阶段学习的都是比较简单的排序,都是所谓的冒泡排序啊,桶排序这类,至于插排和选择排序,再往后又是什么快拍就很尬了。
说一下今天A的题
1075 明明的随机数
1076 排序
1212 最大公约数
1430 素数判定
1978 斐波那契数列
1842 递归第一次
3038 3n+1问题
进制转换和模拟还是很怂,二维数组不是很好,模拟题很方,进制转换就更没什么思路了,至于递推递归,记得并没有讲过,只是自己在看,递推递归都跟for循环挺像的,今天很多题尽量再用cin、cout、子程序、递归思想来写。
然而还是要把明明的随机数拿出来说一下x。
075 明明的随机数 2006年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题解 题目描述 Description 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。 输入描述 Input Description 有2行,第1行为1个正整数,表示所生成的随机数的N个数: 第2行有N个用空格隔开的正整数,为所产生的随机数 输出描述 Output Description 第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小 到大排好序的不相同的随机数。 样例输入 Sample Input 10 20 40 32 67 40 20 89 300 400 15 样例输出 Sample Output 8 15 20 32 40 67 89 300 400
1 #include<cstdio> 2 #include<cmath> 3 #include<cstring> 4 #include<iostream> 5 using namespace std ; 6 int sz[3000]; 7 int tp[3000]; 8 int main () 9 { 10 int a , sum = 0; 11 cin>>a ; 12 for(int i = 1 ; i <= a ; ++i) 13 { 14 cin>>sz[i]; 15 } 16 for(int k = 1 ; k <= a ; ++ k ) 17 { 18 tp[sz[k]] = sz[k] ; 19 } 20 for(int z = 1; z <= 3000 ; ++z ) 21 { 22 if(tp[z]!=0) 23 sum ++ ; 24 } 25 26 cout<<sum<<endl; 27 for(int j = 1 ; j <= 3000 ; ++ j) 28 { 29 if(tp[j]!=0) 30 printf("%d ",tp[j]); 31 } 32 return 0 ; 33 }
显而易见,桶排序思想,tp这个数组中的第【sz的第【k】项】就是其sz【k】的值,比如sz第1项为79,那么tp第79项就为1。之后要要完成去重的任务,所以将其判断一波if(tp[z] != 0)这个数组tp只要有值,不论为几,总数就加一,因为在tp已经把去重的任务完成了,以及循环的边界条件是瞎写的,只是觉得需要尽可能的大,之后再输出就行了。
补充一下问号表达式
问号表达式就是另一种if,先给一个条件,然后加一个问号,如果为条件为真,成立,那么对应的行为为问号后的语句,冒号,不然就是冒号后面的语句。
举个例子
辗转相除
1 int gcd(int n ,int m ) 2 { 3 return n%m==0?m:gcd(m,n%m); 4 }
其意思就是n于m的取余如果为真,那么return m ,反之return gcd(m,n%m),把n换成m,m换成n模m,辗转相除的思想就体现出来了。
将其被除数转换成为除数,除数转换为余数,如果整除了,那么其最小公约数就出来了,就是m值。这里还是递归的套路,自己调用自己的程序,自己调自己,(ps这里多谢MZH和LY= =)所谓搜索也是这个套路。
以及有了这些递归和子程序的基础,可以走DP了。hhhhhhhhhhhhhhhhhh
今天很想写一下树,但是太皮了,二叉树最大宽度高度的,什么序遍历的,汉诺塔游戏的还是觉得需要过一阵,以及字符串还是得整。
(就当今天18号好了)
还有210天初赛, 还有238天复赛。
那是我愿意付诸一生的人,现在却没法拥有。
【正常向】CODEVS上分黄金