算法比赛就此不打啦,学了点皮毛混了个省一国二就跑路了(蓝桥杯退役也太真实了),要是能早点知道算法比赛这类东西就好了,大一大二也不至于这么混过去,这样相识与分别也挺奇妙的,因为也没多久,也没什么好怀念的了。把之前写过的算法的东西全放这里吧,纪念一下吧。
各种算法网站:
HDU——经典航电,题目杂,综合,没有错误提示
POJ——北大,跟航电区别不大
USACO——美国算法题库,题目偏难,有脑筋急转弯的感觉,不适合练手但适合练脑,有错误提示
Codeforces——打CF上分很刺激,有错误提示
Hackerrank——分奴必备
牛客竞赛——天天抽奖永远不会成为欧皇,比赛多,国内体验较佳
Vjudge——帮你做了各种Online Judge总结了
各OJ题目分类总结
赛码——面试算法题
LeetCode——领扣,面试算法题,分类详细学习方便,有错误提示
DFS
Problem description
概率论老师:听懂了么?
大家:。。。
概率论是门有趣的学科,但我不想凭概率挂科,是时候认真看看书了
书里有一道这样的题目:
一俱乐部有5名一年级学生,2名二年级学生,3名三年级学生,2名四年级学生。
在其中任选5名学生,求一、二、三、四年级学生均包含在内的概率。
概率论是个细活,不过我比较粗心,经常漏掉几种情况而算错
现在我想让你编个程序列举出所有符合要求(各年级学生均包含在内)的情况
Input
首先输入一个t表示有t组样例
每组样例有两行输入
第一行输入N(1<=N<=6)表示有N个年级,紧接着按顺序输入从1到N每个年级对应的学生数量m(1<m<50)
第二行输入要抽选的学生人数n(N<=n<=总人数)
Output
用n代表一个属于n年级的学生
例如:1 2 3 4 4 代表1名一年级、1名二年级、一名三年级和两名4年级的学生的组合
对于每组样例,每种组合按年级顺序输出对应学生并用空格隔开(行尾没有多余空格),并按字典序输出所有可能的组合
Sample Input
2
4 5 2 3 2
5
1 4
2
Sample Output
1 1 2 3 4
1 2 2 3 4
1 2 3 3 4
1 2 3 4 4
1 1
简单DFS思路
先从各年级取一个人,然后再DFS各年级的剩下的人,取出来全部后排序即可。
重点在于不能重复计算,所以要从小到大执行。
Java代码
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static int grades; //年级数
static int[] men; //各年级的人数
static int num; //总共需要的人数
static int[] dfs; //用于存放选取出来的人
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
while(n-->0){
grades = sc.nextInt();
men = new int[grades+1];
for(int i = 1 ; i <= grades ; i++){
men[i] = sc.nextInt();
}
num = sc.nextInt();
dfs = new int[num+1];
for(int i = 1; i <= grades ; i++){
dfs[i] = i;