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. [webpack]深入学习webpack核心模块tapable

    一.手动实现同步钩子函数 1.SyncHook class SyncHook { // 钩子是同步的 constructor(args){ this.tasks = []; } tap(name,ta ...

  2. jar启动脚本shell

    #!/bin/bash#这里可替换为你自己的执行程序,其他代码无需更改 APP_NAME=/opt/server/msp/health-api/health-2.0.2.jar#使用说明,用来提示输入 ...

  3. 002-创建型-01-工厂方法模式(Factory Method)

    一.概述 定义一个创建对象的接口,但让实现这个接口的类来决定实例化那个类,工厂方法让类的实例化推迟到子类中进行. 工厂方法模式(FACTORY METHOD)同样属于一种常用的对象创建型设计模式,又称 ...

  4. 批量删除Maven 仓库未下载成功.lastupdate 的文件

    Windows: @echo off echo 开始... for /f "delims=" %%i in ('dir /b /s "./*lastUpdated&quo ...

  5. MySQL之二进制日志

    一.Binlog日志格式 根据日志定义的格式不一样,可以分为Statement格式.Row格式或者MIXED格式 mysql5.6----> | binlog_format | STATEMEN ...

  6. 阶段5 3.微服务项目【学成在线】_day16 Spring Security Oauth2_05-SpringSecurityOauth2研究-搭建认证服务器

    3 Spring Security Oauth2研究 3.1 目标 本项目认证服务基于Spring Security Oauth2进行构建,并在其基础上作了一些扩展,采用JWT令牌机制,并自定 义了用 ...

  7. Vue-cli安装,创建Vue项目

    1.安装脚手架: npm install -g vue-cli 2.查看vue: vue 3.查看可以使用的模板: vue list 4.创建项目sell: vue init webpack sell ...

  8. 【Leetcode_easy】771. Jewels and Stones

    problem 771. Jewels and Stones solution1: class Solution { public: int numJewelsInStones(string J, s ...

  9. react 点击事件

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. Caché到MySQL数据同步方法!

    随着医疗行业信息化的发展,积累了大量的业务数据,如何挖掘这些数据,实现数据的可视化被提上日程,医院中通常有许多的信息化系统,使用的又都是不同厂商的数据库产品,如何统一汇聚数据,实现数据互通也是一个大问 ...