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. paint之文字示例

    package com.loaderman.customviewdemo; import android.content.Context; import android.graphics.Canvas ...

  2. CentOS7下搭建zabbix监控(五)——Web端配置自动发现并注册

    好像有点问题,没法自动添加主机,我后期再测测 (1).自动发现主机并注册 1)创建发现规则 2)编辑自动发现规则信息(这两步不配置问题也不大,因为在动作中也有主机IP地址) 3)添加自动发现的动作 4 ...

  3. (七)Centos之链接命令

    一.链接命令:ln  (link) ln -s [源文件] [目标文件] 功能描述:生成链接文件 选项: -s 创建软链接 二.硬链接 硬链接特征: 1,拥有相同的i节点和存储block块,可以看作是 ...

  4. 无法连接App Store

    试了很多网上的方法,都没有效果,最后把hosts文件清空了,就可以了,不知道是为啥,同一份hosts文件在屋里能用,公司就不能用.

  5. 函数 、while、case、select 语句结合

    [root@bogon ~]# cat menue.sh #!/bin/bash yum_list(){ #列出所有yum安装包 yum repolist [ $? -eq ] && ...

  6. LINQ语法详解

    我会通过一些列的实例向大家讲解LINQ的语法. 先创建一个Person类,作为数据实体 public class Person { public string Name { get; set; } p ...

  7. 它在 ServiceHost 指令中提供为 Service 特性值,或在配置元素 system.serviceModel/serviceHostingEnvironment/serviceActivations 中提供

    找不到类型“Services.CalculatorService”,它在 ServiceHost 指令中提供为 Service 特性值,或在配置元素 system.serviceModel/servi ...

  8. 记录一下我的git连接不上GitHub问题

    1.日常操作,提交代码,报错误下: $ git clone git@github.com:hanchao5272/myreflect.git Cloning into 'myreflect'... s ...

  9. JPEG2000开发SDK及其特点

    JPEG2000开发SDK及其特点 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:JPEG2000被开发来取代JPEG,但因为大量核心算法被专利注册, ...

  10. CNN-1: LeNet-5 卷积神经网络模型

    1.LeNet-5模型简介 LeNet-5 模型是 Yann LeCun 教授于 1998 年在论文 Gradient-based learning applied to document      ...