/*把数组的每个数拆成素数,拆后最多有多少个数*/ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class MaxPrimeNum { public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); long len = Long.parseLong((br.readLine().trim().split(" "))[0]); String[] strs = br.readLine().trim().split(" "); long count = 0; for (int i = 0; i < len; i++) { long tmp = Long.parseLong(strs[i]); count += tmp /2; } System.out.println(count); }
2.借鉴了一个牛友的思想,类似于merge
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; /* * 给一个长度为m的序列T,求一个长度为n的序列S,要求T是S的子序列(T是由S删除数字得到的)求S按字典序排序的最小序列。 * */ public class MinDictionarySequence { public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] strs = br.readLine().trim().split(" "); int n = Integer.parseInt(strs[0]); int m = Integer.parseInt(strs[1]); int[] nums = new int[m]; //[2,1,5] int[] res = new int[n]; HashSet<Integer> set = new HashSet<>(); strs = br.readLine().trim().split(" "); for (int i = 0; i < nums.length; i++) { nums[i] = Integer.parseInt(strs[i]); set.add(nums[i]); } int max = Math.max(n, maxOfNums(nums)); int[] temp = new int[max-m]; int a = 0; for(int i = 1; i <= max; i++) { if(set.contains(i)) continue; else temp[a++] = i; } //temp = [3,4] 有个疑问,不算0的? 0 2 1 3 5字典序比2 1 3 4 5小吧? Arrays.sort(temp); //Merge int nums_i = 0, temp_i = 0, res_i = 0; while(nums_i < m && temp_i < temp.length ) { if(nums[nums_i] < temp[temp_i]) res[res_i++] = nums[nums_i++]; else res[res_i++] = temp[temp_i++]; } while(nums_i < m) res[res_i++] = nums[nums_i++]; while(temp_i < temp.length ) res[res_i++] = nums[temp_i++]; for (int i = 0; i < res.length; i++) { if(i != res.length - 1) System.out.print(res[i] + " "); else System.out.print(res[i]); } } public static int maxOfNums(int[] nums) { int max = Integer.MIN_VALUE; for (int i = 0; i < nums.length; i++) { max = Math.max(nums[i], max); } return max; } }3.人家直接递归进去了,我还在想怎么利用leetcode 416的函数,然后怎么去掉一些值...
package com.netease.yanxuan; /*两个人分钱,给一组数组,[5,15,30,30,60],求两个人的钱数相同时多余的部分最少是多少 * 子集和 * */ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class MinDrop { static int res = Integer.MAX_VALUE; static int sum = 0; public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int t = Integer.parseInt((br.readLine().trim().split(" "))[0]); for (int i = 0; i < t; i++) { int n = Integer.parseInt((br.readLine().trim().split(" "))[0]); String[] strs = br.readLine().trim().split(" "); int[] arr = new int[n]; res = Integer.MAX_VALUE; sum = 0; for (int j = 0; j < arr.length; j++) { arr[j] = Integer.parseInt(strs[j]); sum += arr[j]; } System.out.println(sum); // Arrays.sort(arr); minDropValue(arr, 0, 0, 0 ); System.out.println(res); } } //递归 public static void minDropValue(int[] arr, int index, int ans1, int ans2) { if(index == arr.length) { if(ans1 == ans2) res = Math.min(res, sum - 2*ans1); return; } int val = arr[index]; minDropValue(arr, index+1, ans1, ans2);//谁都不给 minDropValue(arr, index+1, ans1+val, ans2);//给第一个人 minDropValue(arr, index+1, ans1, ans2+val);//给第二个人 } }4.蹲一个大佬来补一个答案。。。 万分感谢
给出一个无向图,一共有n个点,m条边,每条边的权值为v。
求一个生成树,使得图保持联通的同时,权值的最大值和最小值之差最小。
输入
第一行为n和m,表示点的个数和边的条数
后面为m行,表示m条边的两个顶点和其权值
3 5
1 2 10
1 3 5
3 1 12
2 3 19
1 2 74
输出
2 选择边1和3,最小差值为12-10
全部评论
(3) 回帖