1,每个小孩的糖果数量是多少

  有p个小孩,c个糖果,刚开始第1个小孩发一个糖果,第2个小孩发两个糖果,第p个小孩发p个糖果,如果糖果没有发完,就接着【注意】第1个小孩发p+1个糖果.....第p个小孩发2*p个糖果,如果糖果还没有发完,就继续下一轮,第1个小孩发2*p+1个糖果,...

方法一,遍历【这种方法太low了就折叠一下】

package com.cnblogs.mufasa.Main1;

import java.util.Scanner;

public class Main {
public static int[] getCandies(int c,int p){
int[] pGet=new int[p];
int preNum=1;
while (c!=0){
for(int i=0;i<p;i++){
if(preNum<c){
pGet[i]+=preNum;
c-=preNum;
preNum++;
}else {
pGet[i]+=c;
return pGet;
}
}
}
return null;
} public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int c=Integer.valueOf(sc.next());
int p=Integer.valueOf(sc.next());
int[] pGet=getCandies(c,p);
System.out.print("[");
for(int i=0;i<p-1;i++){
System.out.print(pGet[i]+",");
}
System.out.println(pGet[p-1]+"]");
}
}
/*
7
4
*/

方法二,数学推导【算法复杂度急速降低】除了,推理的时候复杂一些,其他都还好

package com.cnblogs.mufasa.Main1;

import java.util.Scanner;

public class Main1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// int c = Integer.valueOf(sc.next());
// int p = Integer.valueOf(sc.next()); //0,测试
int c=45,p=4; int lineSum=(1+p)*p/2;//1+2+3+...+p的总数
int leve=0,preCan=c; //1,1先判断出是在第几层中断【正确】
while (true){
if(preCan<leve*p*p+lineSum){
break;
}
preCan-=(leve*p*p+lineSum);
leve++;
} int[] pGet=new int[p]; //1,2直接算出各个小朋友持有的糖果数【还是要区分第0层与其他层的区别】
if(leve!=0){//1,2,2 非第0层中断
int temp=p*(leve-1)*leve/2;
for(int i=1;i<=p;i++){
pGet[i-1]=temp+i*leve;
}
} int preSta=p*leve;
for(int i=1;i<=p;i++){
if(preCan<preSta+i){
pGet[i-1]+=preCan;
break;
}else {
pGet[i-1]+=(preSta+i);
}
preCan-=(preSta+i);
} //3数据输出
System.out.print("[");
for(int i=0;i<p-1;i++){
System.out.print(pGet[i]+",");
}
System.out.println(pGet[p-1]+"]");
}
}

2,找两个数组公有的数

方法一:使用HashSet和TreeSet解决问题,但是只AC60%!!!可能是耗时太多【时间复杂度大】理解简单易懂

package com.cnblogs.mufasa.Main2;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Scanner;
import java.util.TreeSet; public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String str0=sc.next();
String str1=sc.next(); String[] strs0=str0.substring(1,str0.length()-1).split(",");
String[] strs1=str1.substring(1,str1.length()-1).split(","); if(str0.length()<str1.length()){
String[] temp=strs0;
strs0=strs1;
strs1=temp;
} HashSet<Integer> hs=new HashSet<>();
TreeSet<Integer> tsOut=new TreeSet<>();
for(int i=0;i<strs0.length;i++){
hs.add(Integer.valueOf(strs0[i]));
} for(int i=0;i<strs1.length;i++){
int temp=Integer.valueOf(strs1[i]);
if(hs.contains(temp)){
tsOut.add(temp);
}
} System.out.print("[");
for(int i=0;i<tsOut.size()-1;i++){
System.out.print(tsOut.pollFirst()+",");
}
System.out.print(tsOut.pollFirst());
System.out.println("]");
}
}
/*
[1,2,2,1,3]
[2,2,3] [2,3]
*/

方法二:直接使用遍历进行,省略了计算hash值以及进行查找的费时操作【算法复杂度降低并且拥有两个光标进行判断】

package com.cnblogs.mufasa.Main2_1;

import java.util.*;

public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
// String str0=sc.next();
// String str1=sc.next(); //测试
String str0="[1,2,2,1,3]";
String str1="[2,2,3]"; String[] strs0=str0.substring(1,str0.length()-1).split(",");
String[] strs1=str1.substring(1,str1.length()-1).split(","); if(str0.length()<str1.length()){
String[] temp=strs0;
strs0=strs1;
strs1=temp;
} int[] arr0=new int[strs0.length];
int[] arr1=new int[strs1.length];
for(int i=0;i<arr0.length;i++){
arr0[i]=Integer.valueOf(strs0[i]);
}
for(int i=0;i<arr1.length;i++){
arr1[i]=Integer.valueOf(strs1[i]);
} Arrays.sort(arr0);//排序
Arrays.sort(arr1); ArrayList<Integer> tsOut=new ArrayList<>();
int index0=0,index1=0;
while (index0<arr0.length&&index1<arr1.length){
if(arr0[index0]==arr1[index1]){
if(!tsOut.contains(arr0[index0])){
tsOut.add(arr0[index0]);
}
index0++;
}else if(arr0[index0]<arr1[index1]){
index0++;
}else {
index1++;
}
} System.out.print("[");
for(int i=0;i<tsOut.size()-1;i++){
System.out.print(tsOut.get(i)+",");
}
System.out.print(tsOut.get(tsOut.size()-1));
System.out.println("]");
}
}
/*
[1,2,2,1,3]
[2,2,3] [2,3]
*/

3,最少几个硬币找零

  例如:有1,2,5面值的硬币,请问11元钱最少多少硬币可以凑成,如果无法凑成直接输出-1【之前AC80%原因找到了,是输出-1这个没有安排上】

package com.cnblogs.mufasa.Main3;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.Scanner;
import java.util.Stack; //递归调用,好像可以很好的解决问题
public class Main {
private final static int NUM=Integer.MAX_VALUE;
private static Stack<Integer> stack=new Stack<>();
static {
stack.push(NUM);
} public static int sinFin(int[] sinM,int m,int num,int index){
if(num>stack.peek()){
return NUM;
} if(m==0){//1,1钱已经凑够
stack.push(num);
return num;
}else if(index==0&&m%sinM[0]!=0){//1,2达到终点,但是不能凑成整数倍,返回一个最大值
return -1;
}else if(index==0&&m%sinM[0]==0){//1,3到达终点,并且凑整数
stack.push(num+m/sinM[0]);
return num+m/sinM[0];
} int bei=m/sinM[index];
ArrayList<Integer> arr=new ArrayList<>();
for(int i=0;i<=bei;i++){
arr.add(sinFin(sinM,m-sinM[index]*i,num+i,index-1));
} arr.sort((a,b)->{
return a-b;
});
for(int temp:arr){
if(temp>0){
return temp;
}
}
return -1;
} public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String str0=sc.nextLine().replace(" ","");
String str1=sc.next(); String[] strs=str0.substring(1,str0.length()-1).split(",");
int[] sinM=new int[strs.length]; for(int i=0;i<strs.length;i++){
sinM[i]=Integer.valueOf(strs[i]);
} int m=Integer.valueOf(str1); System.out.println(sinFin(sinM,m,0,sinM.length-1)); }
} /*
[1, 2, 5]
11 3 [2, 4, 6]
11 */

奇妙的算法【9】YC每个小孩的糖果数,找公约数,最少硬币数的更多相关文章

  1. 算法之Python实现 - 002 : 换钱的最少货币数补充(每种货币只能使用一次)

    [题目]:给定数组arr,arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币仅可以使用一张,再给定一个整数aim代表要找的钱数,求组成aim的最少货币数. [代码1]:时间与额 ...

  2. 算法之Python实现 - 001 : 换钱的最少货币数

    [题目]给定数组arr,arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim代表要找的钱数,求组成aim的最少货币数. [代码1]:时间与额外 ...

  3. Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全 C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数 C# 算法题系列(一) 两数之和、无重复字符的最长子串 DateTime Tips c#发送邮件,可发送多个附件 MVC图片上传详解

    Newtonsoft.Json C# Json序列化和反序列化工具的使用.类型方法大全   Newtonsoft.Json Newtonsoft.Json 是.Net平台操作Json的工具,他的介绍就 ...

  4. 奇妙的算法之LCS妙解

    LCS算法妙解 LCS问题简述:最长公共子序列 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则S 称为已知序列的最长公共子序列. LCS问题的分支:最长公共子串 ...

  5. 奇妙的算法【11】LeetCode-专属算法面试题汇总

    这个是LeetCode上面的编程训练专项页面,地址:https://leetcode-cn.com/explore/interview/card/top-interview-quesitons-in- ...

  6. 奇妙的算法【7】-贪婪算法-dp

    问题1描述:[贪婪算法,Dijistra算法] ①有一只兔子要从一个N*N的二维矩阵方格中从上跳到下面: ②每次只能向左或向下,越过一个方格,跳到下一个方格中: ③被越过的方格中的数值,表示该兔子越过 ...

  7. 奇妙的算法【10】TX--有效号码、最,小耗时、最小差值、差值输出、异或结果

    昨晚刚刚写的几道算法题,难度也还行,就是全部AC有些困难,当时第一题AC.第二题AC 60%,第四题AC 40%,第五题没有时间写完了,这个应该全部AC了:其中第三题没有写出来 1,是否存在符合规范的 ...

  8. 奇妙的算法【4】-汉诺塔&哈夫曼编码

    1,汉诺塔问题[还是看了源码才记起来的,记忆逐渐清晰] 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着6 ...

  9. 奇妙的算法【6】-WY回文、树、最优化、卷积判断

    1,判断一个十进制正整数的二进制数是否为回文 package com.cnblogs.mufasa.answer1; import java.util.Scanner; public class Ma ...

随机推荐

  1. MIPS 指令集(共31条)

    MIPS 指令集(共31条) MIPS 指令集(共31条) 助记符 指令格式 示例 示例含义 操作及其解释 Bit # 31..26 25..21 20..16 15..11 10..6 5..0 R ...

  2. mac下如何安装python3?

    1. 安装homebrew $ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/insta ...

  3. Django开发简单采集用户浏览器信息的小功能

    Django开发简单采集用户浏览器信息的小功能 Centos环境准备 yum install –y python-pip export http_proxy=http://10.11.0.148:80 ...

  4. Quartz.Net 学习随手记之03 配置文件

    第一种方式:直接写入代码中 NameValueCollection properties = new NameValueCollection(); properties["quartz.sc ...

  5. python中的列表推导式——轻量级循环

    列表推导式(list comprehension)是利用其他列表创建新列表(类似于数学术语中的集合推导式)的一种方法.它的工作方式类似于for循环,也很简单. 列表推导式书写形式: [表达式 for ...

  6. Java下载HTTP URL链接示例

    这里以下载迅雷U享版为例. 示例代码: package com.zifeiy.snowflake.handle.filesget; import java.io.File; import java.i ...

  7. Spring Boot中在程序中获得application.properties中的值

    方法是使用@Value注解的方式注解一个值. 首先,在我们的application.properties中添加一个值如下: zifeiy.tmpfile.location=D:/duty 然后在我们的 ...

  8. 细说SQL Server中的加密

    简介 加密是指通过使用密钥或密码对数据进行模糊处理的过程.在SQL Server中,加密并不能替代其他的安全设置,比如防止未被授权的人访问数据库或是数据库实例所在的Windows系统,甚至是数据库所在 ...

  9. iOS面试-深拷贝和浅拷贝

    浅copy:实际上的内存只有一份 任何copy都只是指向这个内存的一个引用 深copy:原始数据有一份 每一个copy的对象不再是引用 而是内容大小一样 内存地址不同的独立对象 系统的非容器类对象 c ...

  10. 最新 多益网络java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿. 多益网络等10家互联网公司的校招Offer,因为某些自身原因最终选择了 多益网络.6.7月主要是做系统复习.项目复盘.Le ...