
算法学习
算法与数据结构
哆啦AI梦
这个作者很懒,什么都没留下…
展开
-
错误票据
某涉密单位下发了某种票据,并要在年终全部收回。每张票据有唯一的ID号。全年所有票据的ID号是连续的,但ID的开始数码是随机选定的。因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某个ID断号,另外一个ID重号。你的任务是通过编程,找出断号的ID和重号的ID。 假设断号不可能发生在最大和最小号。要求程序首先输入一个整数N(N<100)表示后面数据行数。接着读入N行数据。每行数据长度不等,是用空格分开的若干个(不大于100个)正整数(不大于100000)每个整数代表一个ID号。要求程序原创 2020-09-26 00:36:43 · 722 阅读 · 0 评论 -
梅森素数
如果一个数字的所有真因子之和等于自身,则称它为“完全数”或“完美数” 例如:6 = 1 + 2 + 3,28 = 1 + 2 + 4 + 7 + 14早在公元前300多年,欧几里得就给出了判定完全数的定理: 若 2^n - 1 是素数,则 2^(n-1) * (2^n - 1) 是完全数。 其中 ^ 表示“乘方”运算,乘方的优先级比四则运算高,例如:2^3 = 8, 2 * 2^3 = 16, 2^3-1 = 7 但人们很快发现,当n很大时,判定一个大数是否为素数到今天也依然是个难题。 因为法国数学家梅森的原创 2020-09-21 15:02:51 · 769 阅读 · 0 评论 -
振兴中华
动态规划;代码:import java.util.*;public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); int m = sc.nextInt(); int n = sc.nextInt(); int[][] dp = new int[m+1][n+1]; sc.close(); for(int i = 1;i <= m;.原创 2020-09-21 14:40:28 · 117 阅读 · 0 评论 -
世纪末的星期(2013-Java-A)
曾有邪教称1999年12月31日是世界末日。当然该谣言已经不攻自破。还有人称今后的某个世纪末的12月31日,如果是星期一则会… 有趣的是,任何一个世纪末的年份的12月31日都不可能是星期一!! 于是,“谣言制造商”又修改为星期日…1999年的12月31日是星期五,请问:未来哪一个离我们最近的一个世纪末年(即xx99年)的12月31日正好是星期天(即星期日)? 请回答该年份(只写这个4位整数,不要写12月31等多余信息)首先,我们学习Calendar的用法:1.获取时间Calendar cal = Ca原创 2020-09-20 22:02:08 · 244 阅读 · 0 评论 -
在两个长度相等的排序数组中找到中位数
/*public class Main{ public static int getUpMedia(int[] arr1,int[] arr2) { if(arr1 == null || arr2 == null) { return -1; } else { return find(arr1,0,arr1.length-1,arr2,0,arr2.length-1); } } public static int find(int[] arr1,int l1,int r1,.原创 2020-09-20 21:12:25 · 182 阅读 · 0 评论 -
在有空字符串的有序字符串数组中查找
有个排序后的字符串,其中散布着一些空字符串,编写一个方法,找出给定字符串(肯定不是空字符串)的索引。import java.util.*; public class Main{ public static void main(String[] args) { String[] arr = {"a","","ac","","ad","b","","ba"}; int res = indexOf(arr,"ad"); System.ou原创 2020-09-05 00:46:00 · 152 阅读 · 0 评论 -
矩阵取数游戏
#include <iostream>#include <bits/stdc++.h>using namespace std;#define MAX 1001int main(){ int a[MAX][MAX]; int n; cin >> n; for(int i = 1;i <= n;i++){ for(int j = 1;j <= n;j++){ cin >&g.原创 2020-09-01 02:25:43 · 230 阅读 · 0 评论 -
单调递增最长子序列
解法:动态规划#include <iostream>#include<bits/stdc++.h>using namespace std;#define MAX 10001int main(){ int a[MAX]; int n; cin >> n; int dp[n+1]; dp[0] = 1; for(int i = 0;i < n;i++){ cin >> a[i].原创 2020-08-31 16:53:35 · 87 阅读 · 0 评论 -
最大子段和问题——动态规划
#include <iostream>#include <bits/stdc++.h>using namespace std;#define MAX 1001int a[MAX];int main(){ int n; cin >> n; for(int i = 1;i <= n;i++){ cin >> a[i]; } int dp[n+1]; int res = 0; ..原创 2020-08-30 03:09:31 · 109 阅读 · 0 评论 -
排列问题
#include <iostream>#include <bits/stdc++.h>using namespace std;void swap(int &a , int &b){ int temp; temp = a; a = b; b = temp; }void Perm(int list[], int k, int m){ if(k == m){ for(int i = 0;i <= m;i++) .原创 2020-08-29 00:23:38 · 101 阅读 · 0 评论 -
出现k次与出现1次
解法1;HashMappublic static int getOnce2(int[] nums) { Map<Integer, Integer> map = new HashMap<Integer, Integer>(); for (int i = 0; i < nums.length; i++) { if(map.containsKey(nums[i])) { int num = map.get(nums[i]); num++; map.pu.原创 2020-08-12 21:42:35 · 127 阅读 · 0 评论 -
0~1之间浮点实数的二进制表示(Java)
import java.util.*;public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); double n = sc.nextDouble(); sc.close(); StringBuilder sb = new StringBuilder("0."); while(n > 0) { double r = 2 * n; .原创 2020-08-12 20:44:07 · 259 阅读 · 0 评论 -
将整数的奇偶位调换(Java)
import java.util.*;public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); sc.close(); int ou = n & 0xaaaaaaaa; //和1010 1010 ....(32位)做&运算取出偶数位 int ji = n & 0x55555原创 2020-08-12 20:12:32 · 375 阅读 · 0 评论 -
是不是2的整数次方(Java)
思路:一个数是2的整数次方,意味着这个数用二进制表示是里面只有一个数字是1,我们仍然采用位运算import java.util.*;public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); sc.close(); if(((n-1)&n)==0) { System.out.printl.原创 2020-08-12 16:59:28 · 251 阅读 · 0 评论 -
二进制中1的个数
import java.util.*;public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); sc.close(); int ans = 0; while(n!=0) { n = n & (n-1); ans++; } System.out.println(ans);.原创 2020-08-12 16:51:17 · 93 阅读 · 0 评论 -
找出落单的那个数(Java)
算法思路:异或运算import java.util.*;public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[] arr = new int[n]; sc.nextLine(); for(int i = 0;i < n;i++) { arr[i] = sc.nextInt(.原创 2020-08-12 16:39:26 · 330 阅读 · 0 评论 -
如何找数组中唯一成对的那个数?
思路: 异或运算解法一:import java.util.*;public class Main{ public static void main(String[] args) { int N = 1001; int[] arr = new int[N]; for(int i = 0;i < N;i++) { arr[i] = i+1; } arr[N-1] = new Random().nextInt(N-1)+1; int index = new Ra.原创 2020-08-12 16:28:11 · 167 阅读 · 0 评论 -
位运算的奇技淫巧
1.判断一个数x的奇偶性:x & 1 = 1 //x为奇数x & 1 = 0 //x为偶数2.n个数(1~n)放入n+1的空间中,其中一个数重复,求这个重复的数原理:异或运算(相同为0,不同为1)3.输入一个数,输出该数的二进制表示时1的个数while(n){ n = n & (n-1); ans++;}4.将十进制的数转化为二进制...原创 2020-08-11 21:50:40 · 87 阅读 · 0 评论 -
素数的个数(Java)
埃氏筛法import java.util.*;public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); sc.close(); int[] prime = new int[1000001]; boolean[] is_prime = new boolean[100000002]; int ..原创 2020-08-03 11:27:42 · 865 阅读 · 0 评论 -
判断素数(Java)
import java.util.*;public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); sc.close(); if(isPrime(n)== true) { System.out.println("YES"); } else { System.out.println("NO.原创 2020-08-03 11:04:14 · 1099 阅读 · 0 评论 -
线段上格点的个数(Java)
辗转相除法,答案就是gcd(abs(x1-x2),abs(y1-y2))-1,为什么可以这样做呢? 仔细想想,求出最大公约数g,也就是把y分为g个部分组成,x也是g个部分组成,这样的话,从起点开始,每次横坐标和纵坐标分别增加相应的一部分,一直增到终点,这个过程就是模拟的过程import java.util.*;public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(Syste.原创 2020-08-03 10:53:25 · 243 阅读 · 0 评论 -
划分数——java
在解这道题之前,我们先看一道跟这道题很像的题目:把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问有多少种不同的分法?(注:5,1,1和1,1,5是同一种分法)问题分析:f(m,n): 表示把m个苹果,放入n个盘子的分配方法总数1.当m = 0或 n = 1时,只有一种分法2.当m < n 时,即当苹果数少,盘子过剩时。此时一定有n-m个盘子一直空着,去掉他们对于分配的总数没有影响。if(m < n) f(m,n) = f(m,m);3.当 m >= ..原创 2020-07-20 22:05:38 · 153 阅读 · 0 评论 -
最长上升子序列问题
问题分析:dp[i] : 以a[i]结尾的最长上升子序列的长度递推公式:import java.util.*;public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[] a = new int[n]; for(int i = 0;i < n;i++) { a[i] = .原创 2020-07-18 15:37:12 · 204 阅读 · 0 评论 -
完全背包问题——Java
import java.util.*;public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[] w = new int[n]; int[] v = new int[n]; for(int i = 0;i < n;i++) { w[i] = sc.nextInt(); v[..原创 2020-07-17 14:17:29 · 914 阅读 · 0 评论 -
0-1背包问题——java
解法一:dp[i][j] : 从第i个物品开始挑选总重小于j时,总价值的最大值递推式:代码:import java.util.*;public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[] w = new int[n]; int[] v = new int[n]; for(int i.原创 2020-07-15 16:05:48 · 239 阅读 · 0 评论 -
最长公共子序列问题——(java)
问题分析:dp[i][j]:s1 ,s2,…,si和t1,t2,…,tj对应的最长公共子序列因此,对于s1 ,s2,…,si,s(i+1)和t1,t2,…,tj,t(j+1)对应的最长公共子序列是:当s(i+1) == t(j+1)时,在s1 ,s2,…,si和t1,t2,…,tj的最长公共子序列加上s(i+1)或t(j+1)s1 ,s2,…,si和t1,t2,…,tj,t(j+1)的最长公共子序列s1 ,s2,…,si,s(i+1)和t1,t2,…,tj的最长公共子序列递推公式:代码:.原创 2020-07-14 16:08:20 · 256 阅读 · 0 评论 -
Saruman‘s Army(POJ3069-Java)
DescriptionSaruman the White must lead his army along a straight path from Isengard to Helm’s Deep. To keep track of his forces, Saruman distributes seeing stones, known as palantirs, among the troops. Each palantir has a maximum effective range of R unit原创 2020-07-05 21:26:38 · 138 阅读 · 0 评论 -
Best Cow Line(POJ3617)Java实现
DescriptionFJ is about to take his N (1 ≤ N ≤ 2,000) cows to the annual"Farmer of the Year" competition. In this contest every farmer arranges his cows in a line and herds them past the judges.The contest organizers adopted a new registration scheme this原创 2020-07-02 21:41:55 · 2943 阅读 · 0 评论 -
硬币问题
算法思想:本题采用暴力求解。为了方便起见,那500元的个数为例。正常情况下需要500元硬币的个数是A/500.但是题目提供的总的500元硬币个数是有限的。为了不发生错误只能取二者的最小者。其他硬币个数的取值同理。解题代码:```cpp#include <iostream>#include <algorithm>using namespace std;in...原创 2020-03-20 14:48:51 · 146 阅读 · 0 评论 -
部分和问题——《挑战程序设计竞赛》
采用DFS:import java.util.*;public class Main{ static int n; static int[] arr; static int k; public static void main(String[] args) { Scanner sc = new Scanner(System.in); n = sc.nextInt(); arr = new int[n]; k = sc.nextInt(); for(int ..原创 2020-06-28 22:20:56 · 137 阅读 · 0 评论 -
抽签——《挑战程序设计竞赛》
解法一:import java.util.*;public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int m = sc.nextInt(); int[] arr = new int[3]; for(int i = 0;i < arr.length;i++) { arr[i] = s..原创 2020-06-28 20:39:25 · 258 阅读 · 0 评论 -
全排列问题(洛谷P1706)
问题分析:实际每种排列组合的过程是树的深度遍历过程!用到了回溯法#include <bits/stdc++.h>using namespace std;int n;int box[20],visit[20];//box数组用来存储组合情况,visit数组用于检验当前数字是否访问过void dfs(int step){ if(step == n){ for(int i = 0;i < n;i++){ printf("%5d",.原创 2020-05-19 20:48:16 · 428 阅读 · 0 评论 -
矩阵取数——动态规划
这道题如果按照贪心算法只能解决个别测试点,代码鲁棒性不行。此题的详细分析参考:问题分析解题代码:#include <iostream>#include <algorithm>using namespace std;#define MAX 501int main(){ int a[MAX][MAX],dp[MAX][MAX] = {-1}; ...原创 2020-04-21 21:30:12 · 328 阅读 · 1 评论 -
数字三角形相关解法
解法一:(递归)max_sum(i,j)用来计算D[i][j]到底边最长路径之和。用一个数组MaxSum[i][j]存储D[i][j]到底边最长路径之和,避免重复计算,初始值是-1。根据递归的原理,递归的条件是:MaxSum[i][j] = max(max_sum(i+1,j),max_sum(i+1,j+1)) + D[i][j];#include <iostream>#...原创 2020-04-27 23:13:35 · 189 阅读 · 0 评论