
算法
学无止境jl
学习,运动,动手动脑!
展开
-
Welch_Powell图的顶点着色算法,O(n3)
import java.util.Arrays;class Vertex implements Comparable<Vertex> { int color; int degree; @Override public int compareTo(Vertex o) { return o.degree-this.degree; }}public class Welch_Powell_Color { final st..原创 2021-12-22 18:08:38 · 1025 阅读 · 0 评论 -
线性规划之单纯形法
一、前言迭代改进思想是算法设计中常用的求解最优问题的方法,一般思路是:任取一个可行解判断可行解是否是最优的,若是,算法结束若不是,找到一个比当前可行解更好的可行解,并替代它,继续步骤2事实上,判断可行解的过程就能找到(或不能)一个更好的可行解。线性规划问题,是在约束条件下求最大值或最小值的问题。例如显然z=3x+5y的x越大越好,y越大越好。x=3,y=1得zmax=14而解线性规划问题最好的方法,就是单纯形法了,它也是用到了迭代改进的思想。此外,网络最大流问题,二分图的最大匹配问原创 2021-04-15 17:53:02 · 5745 阅读 · 1 评论 -
OJ时间与效益
问题分析:这是第一个测试用例的草图,可以得出结论,每个任务只耗费1个时间单位,因此优先选择ddl大的任务,在ddl相同时优先选择profit高的那个。如本例中,先选择1号(因为它的deadline最长),获得效益20,再从ddl=1中选取效益最高的3号,获得效益40,即20+40=60。算法思路:将所有存在的deadline按照递减顺序保存起来,将deadline与对应存在的效益列表建立映射关系。每次遍历时,都能确保是最大的 ddl,从效益列表取一个最大的效益出来,该列表剩余的效益继续存放到下一个d.原创 2021-04-12 23:13:11 · 147 阅读 · 0 评论 -
算法-订单问题Java实现
动态规划来实现:首先初始化第一行,a. 只要能没有达到最大数X,就由A来做b. 否则查找之前的A做的最小收益的任务,取当前收益与最小收益的最大值接着更新第二行a. 凡是A未做的,B一定会做(不然就是题目错了,X+Y一定>=N)。b. 若A已做,比较A[i]和B[i](1)若A[i]>B[i],说明A来做更好(2)否则,理论上B来做更好,事实上要分情况:a. 若B当前已做的数目小于Y(最大数),则B替换A来做b. 若B当前已做的数目=Y,计算当前变化量B[i]-A[i],查.原创 2021-04-01 11:48:56 · 363 阅读 · 0 评论 -
算法-按照要求保留数组元素使得和最大Java
分析:sum=0取数组最大的数maxsum+=max删除数组最大元素max和值为max-1的数继续步骤2,直到数组空了直接思路:删除用标志-1来表示import java.util.Scanner;public class SumMax { //查找最大元素下标 public static int selectTheMax(int[] num){ int max = -1; int pos = -1; for(int i=0.原创 2021-04-01 11:33:57 · 118 阅读 · 0 评论 -
格子里的整数-算法Java
import java.util.Scanner;public class FindMinPath { public static void main(String[]args) { Scanner sc=new Scanner(System.in); int testcase=sc.nextInt(); for(int i=0;i<testcase;i++) { int n=sc.nextInt(); int[][]arr=new int[原创 2021-03-29 10:48:10 · 153 阅读 · 0 评论 -
OJ如何花最少的钱购买蔬菜
要求:需要购买三种蔬菜,三种蔬菜必须在不同的商店购买,使得花费最省。import java.util.Scanner;public class BuyVegetable { public static void main(String[]args) { Scanner sc=new Scanner(System.in); int testcase=sc.nextInt(); for(int i=0;i<testcase;i++) { int n=sc.原创 2021-03-27 12:52:46 · 178 阅读 · 0 评论 -
Searching_4 磁铁数组问题Java实现
磁铁数组问题描述分析,每两个数之间必定有一个解,使得左右合力为0方法1:左合力=右合力import java.util.Scanner;public class Magnet { public static void main(String[]args) { Scanner sc=new Scanner(System.in); int n=sc.nextInt(); for(int i=0;i<n;i++){ //1.输入原创 2021-03-10 09:57:50 · 137 阅读 · 0 评论 -
有9个因数-算法java实现
这道题考的是数学,如果暴力破解,估计会timeout,可以化简。首先,根据用例40,推断出36有9个因数,分别是1,36,2,18,3,12,4,9,6。最后一个6需要注意,6*6=36。从特殊到一般,大胆推理,有9个因数的数一定是一个平方数(如1,4,9,16,25,36),因为只有这些数才有复因子。其次,化简判断有9个因子的条件:一个数必然包含1和本身,且平方数必然包含一个因子k(n=k*k),count=3count=3;//k为n的平方根for(int i=2;i<k;i+.原创 2021-03-10 00:35:23 · 289 阅读 · 0 评论 -
Searching_3查询问题算法java实现
方法1:直接拼接一个数组import java.util.Scanner;public class Main { public static void main(String[]args) { Scanner sc=new Scanner(System.in); int testcase=sc.nextInt(); for(int i=0;i<testcase;i++) { int groupnum=sc.nextInt(); int q.原创 2021-03-09 23:28:21 · 137 阅读 · 0 评论 -
书本分发——经典的数组分段求和最小问题,动态规划+二分查找法
说明给你N本书。每本书的页数都是π。你必须把书分配给M个学生。有许多方法或排列可以做到这一点。在每个排列中,M个学生中的一个将被分配最大页数。在所有这些排列中,任务是找出分配给学生的最大页数是所有其他排列中最小页数的特定排列,并打印这个最小值。每本书只分配给一个学生。每个学生至少要分配一本书输入第一行包含表示测试用例数的’T’。接着是对T的描述测试用例:每个用例从一个正整数N开始,表示书。书第二行包含N个空格分隔的正整数,表示每行的页数预定。然后呢第三行包含另一个整数M,表示学生人数N训练:1<原创 2021-01-04 20:24:42 · 1517 阅读 · 0 评论