青少年编程知识记录 codecoming

组合数的写法

前面我们写过 全排列和排列数 等。这篇文章。我们写一下组合数。例题:从n个数中,选出m个,一共有多少种不同的选法?这是一道典型的组合数公式。我们直接用dfs公式肯定会出现重复的。#include<bits/stdc++.h> using namespace std; int n,m; int pd[100],ans[100];//pd数组是判断是否用过这个数,ans是结果数组 void print() { 
作者:亿万年的星光 分类:C++知识 浏览:

【题解】2002-T2 选数

【题目描述】



已知n个整数x1,x2,xn,以及一个整数K(Kn)。从n个整数中任选k个整数相加,可分别 得到一系列的和。例如当

n=4=34个整数分别为3,7,12,19时,可得全部的组合与它们的和为:



3+7+12=22   3+7+19=29   7+12+19=38  3+12+19=34

现在,要求你计算出和为素数共有多少种。

例如上例,只有一种的和为素数:(3+7+19=29)

【输入描述】





        第一行为nk(1n20,kn)



        第二行为n个数x1x2xn(1xi5000000),各数之间用一个空格隔开)

【输出描述】

        一个整数(满足所有条件的种数)

【样例输入】

4 3   3 7 12 19

【样例输出】

1
作者:亿万年的星光 分类:题解目录 浏览:

质数(素数)的判断

一、定义法// 1 定义法(除了1和他本身之外,没有任何一个数能被整除)(试除法) bool is_prime3(unsigned long long n) { //slow     for (int i = 2; i < n - 1; i++) { &nb
作者:亿万年的星光 分类:C++知识 浏览:

【题解】2001-T1 数的计数

【题目描述】我们要求找出具有下列性质数的个数(包含输入的自然数nn):先输入一个自然数n(n≤1000)n(n≤1000),然后对此自然数按照如下方法进行处理:1.不作任何处理;2.在它的左边加上一个自然数,但该自然数不能超过原数的一半;3.加上数后,继续按此规则进行处理,直到不能再加自然数为止。【输入描述】输入n。【输出描述】数的个数。【样例输入】6【样例输出】6【提示】样例说明:这6个数是:6 16 26 126 36 136
作者:亿万年的星光 分类:题解目录 浏览:

【题解】单词排序

【题目描述】输入一行单词序列,相邻单词之间由一个或者多个空格间隔,请按照字典序输出这些单词,要求重复的单词只输出一次。(区分大小写)【输入描述】一行单词序列,最少一个单词,最多100个单词,每个单词长度不超过50,单词之间至少1个空格间隔。数据不含除字母、空格外的其他字符。【输出描述】按照字典序输出这些单词,每个单词空一个格。【样例输入】She  wants  to go to Peking University&n
作者:亿万年的星光 分类:题解目录 浏览:

NOIP/CSP-J复赛历年考点

2000计算器的改良税收与补贴乘积最大单词接龙模拟、字符串模拟字符串、动态规划广度优先bfs、字符串2001数的计数最大公约数与最小公倍数求先序排列装箱问题模拟模拟、函数二叉树贪心2002级数求和选数产生数过河卒模拟模拟、素数、DFS、组合高精度深搜(dfs)2003乒乓球数字游戏栈麦森数模拟、字符串DFS、DP栈素数、高精度2004不高兴的津津花生采摘FBI树火星人模拟、数组贪心二叉树全排列、STL2005淘淘摘苹果校门外的树采药循环模拟、数组模拟,数组贪心高精度、数学、数论、递推2006明明
作者:亿万年的星光 分类:C++知识 浏览:

2021CSP-J/S全国晋级二轮分数线公布

普及组CSP-J

序号省市CSP-J人数CSP-J晋级晋级比例最高分晋级最低分
1甘肃

13413399.25%8615
2宁夏10310198.06%6524
3天津46345197.41%8615.5
4云南40237894.03%79.517
5湖北68063292.94%89.526
6海南18617091.40%73.529
7陕西49344790.67%

93.528
8广西79568085.53%8628
9山西77362881.24%95.530
10贵州44733174.05%7130
11吉林45433273.13%9133
12河南111479871.63%

88.534.5
13内蒙古564071.43%58

34.5
14黑龙江35420557.91%8224.5
15新疆42523856.00%81.539
16江西48524750.93%86.636.5
17辽宁4752350.32%90

40
18湖南152874448.69%93.515
19香港723548.61%10045.5
20河北112251846.17%

93.540
21

澳门1033937.86%8231
22重庆143054137.83%9451.5
23上海2841100735.45%94.552.5
24安徽4731155832.93%98.534
25北京339794127.70%

96.553
26四川302870423.25%98.517
27江苏417273717.67%98.538
28广东562798617.52%95.558.5
29浙江606794615.59%9866
30山东11450132611.58%9815



山东普及组分数线55

小学组43





作者:亿万年的星光 分类:C++知识 浏览:

如何估算时间复杂度

首先:

  常见的算法时间复杂度由小到大依次为:Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n^2)<Ο(n^3)<…<Ο(2^n)<Ο(n!)

时间复杂度可以简单理解为最多执行次数。



一、O(1)

一般情况下没有其他循环和递归调用,时间复杂度一般都是O(1)。比如下面这样的代码

#include<iostream>  using namespace std;  int main(){  	int a=0,b=0,x=0,y=0;  	cin>>a>>b;  	x=a+b;  	y=a-b;  	if(x>y){  	 cout<<x;  	}else{  	 cout<<y;  	}  	return 0;  }

二、O(n)

一般情况下,一个循环的时间复杂度是O(n),多个循环并列也是取循环次数最多的那个作为时间复杂度。当数据量增大n倍,耗时增大n倍。

#include<iostream>  using namespace std;  int main(){  	int a=n;  	cin>>n;  	for(int i=0;i<n;i++){  	    cout<<i;  	}  	return 0;  }



三、O(n2)、O(n*m)

双重循环嵌套一般就是O(n2)。当数据量增大n倍,耗时增大n方倍。

#include<iostream>  using namespace std;  int main(){  	int n=0;  	cin>>n;  	for(int i=0;i<n;i++){  	    for(int j=0;j<n;j++){  	        cout<<i;  	    }  	}  	return 0;  }

如果循环嵌套外层循环是n,内层循环是m。

#include<iostream>  using namespace std;  int main(){  	int n=0,m=0;  	cin>>n>>m;  	for(int i=0;i<n;i++){  	    for(int j=0;j<m;j++){  	        cout<<i;  	    }  	}  	return 0;  }

这个时候的时间复杂度是O(n*m)。



四、O(logn)

当数据增大n倍时,耗时增大logn倍。

#include<iostream>  using namespace std;  int main(){  	int n=0;  	cin>>n;  	for(int i=0;i<n;i++){  	   i*=2;  	   cout<<i;  	}  	return 0;  }

本来循环次数是n,现在i*=2了。那么答案是log(2)(n)。

反着想也可以,原来循环n次,现在每次i变成原来的2倍,也就是2的k次方等于n。那么正好就是log(2)(n),即O(log n)



或者下面这样:

#include<iostream>using namespace std;  int main(){  int n=0;  cin>>n;  while((n=n/2)>0){      cout<<n;  }   return 0;  }

时间复杂度也是O(logn)



五、O(nlogn)

一般归并排序和堆排序是O(nlogn)。 

常见的是外层循环的时间复杂度是n,内层循环的时间复杂度是logn。

比如下面这样:

for(int i=1; i<=n; i++)  {  	for(int j=1; j<=n; j+=i)  	{  		.....   //复杂度为O(1);  	}  }

注意:外层循环是n,内层循环j每次都增加i。

作者:亿万年的星光 分类:C++知识 浏览:

指针(三):指针与函数

1.交换的例子#include<iostream> #include<cstdio> #include<cstring> using namespace std; void swap(int x, int y){ int a=x; x=y; y=a; cout<<"函数内部"<<x<<" &q
作者:亿万年的星光 分类:C++知识 浏览:

指针(二):指针与数组

1.指针与数组的关系    指向数组的指针变量称为数组指针变量。“数组是内存上一块连续的空间”。数组名就是这块连续空间的首地址。2.指针指向数组    一开始的数组定义与输出:#include<iostream> #include<cstdio> using namespace std; int main(){ int a[10]; for(int 
作者:亿万年的星光 分类:C++知识 浏览: