奇妙的算法【9】YC每个小孩的糖果数,找公约数,最少硬币数
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每个小孩的糖果数,找公约数,最少硬币数的更多相关文章
- 算法之Python实现 - 002 : 换钱的最少货币数补充(每种货币只能使用一次)
[题目]:给定数组arr,arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币仅可以使用一张,再给定一个整数aim代表要找的钱数,求组成aim的最少货币数. [代码1]:时间与额 ...
- 算法之Python实现 - 001 : 换钱的最少货币数
[题目]给定数组arr,arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim代表要找的钱数,求组成aim的最少货币数. [代码1]:时间与额外 ...
- Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全 C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数 C# 算法题系列(一) 两数之和、无重复字符的最长子串 DateTime Tips c#发送邮件,可发送多个附件 MVC图片上传详解
Newtonsoft.Json C# Json序列化和反序列化工具的使用.类型方法大全 Newtonsoft.Json Newtonsoft.Json 是.Net平台操作Json的工具,他的介绍就 ...
- 奇妙的算法之LCS妙解
LCS算法妙解 LCS问题简述:最长公共子序列 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则S 称为已知序列的最长公共子序列. LCS问题的分支:最长公共子串 ...
- 奇妙的算法【11】LeetCode-专属算法面试题汇总
这个是LeetCode上面的编程训练专项页面,地址:https://leetcode-cn.com/explore/interview/card/top-interview-quesitons-in- ...
- 奇妙的算法【7】-贪婪算法-dp
问题1描述:[贪婪算法,Dijistra算法] ①有一只兔子要从一个N*N的二维矩阵方格中从上跳到下面: ②每次只能向左或向下,越过一个方格,跳到下一个方格中: ③被越过的方格中的数值,表示该兔子越过 ...
- 奇妙的算法【10】TX--有效号码、最,小耗时、最小差值、差值输出、异或结果
昨晚刚刚写的几道算法题,难度也还行,就是全部AC有些困难,当时第一题AC.第二题AC 60%,第四题AC 40%,第五题没有时间写完了,这个应该全部AC了:其中第三题没有写出来 1,是否存在符合规范的 ...
- 奇妙的算法【4】-汉诺塔&哈夫曼编码
1,汉诺塔问题[还是看了源码才记起来的,记忆逐渐清晰] 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着6 ...
- 奇妙的算法【6】-WY回文、树、最优化、卷积判断
1,判断一个十进制正整数的二进制数是否为回文 package com.cnblogs.mufasa.answer1; import java.util.Scanner; public class Ma ...
随机推荐
- phpstorm有红波浪线,怎么找到语法错误的地方
在phpstorm里面,有时候不小心多打了个字符,会导致IDE显示红色波浪线,提示有语法错误了,但是不容易找出在哪一行. 在有红色波浪线的文件上,右键[inspect code]: 检查代码后就会知道 ...
- PorterDuffXfermodeMode.DST_IN
package com.loaderman.customviewdemo.view; import android.animation.ValueAnimator; import android.co ...
- 一个link加载多个css文件
细看正则时匹配慕课网链接时发现的,一个link加载多个css文件 http://static.mukewang.com/static/css/??base.css,common/common-less ...
- web手工项目03-登录功能测试用例及缺陷编写-流程图画法-前后台下单及发货流程图-流程图设计测试用例方法-功能测试涉及到的四种数据库场景
回顾 注册功能测试(步骤,需求分析(输入分析,处理分析,输出分析),数据构造(有效等价类,无效等价类,有效数据,无效数据),编写用例,执行用例,缺陷报告) 轮播图功能测试(步骤,需求分析拆分测试点,测 ...
- 123457123456#0#-----com.threeapp.magicImageShow01----儿童宝宝魔法画笔
com.threeapp.magicImageShow01----儿童宝宝魔法画笔
- ubuntu 17.04 Tomcat安装
安装Tomcat分为两步: JDK和Tomcat 安装jdk 1.在oralce官网下载jdk
- iOS——数据安全
在移动互联网快速发展的今天,iOS应用直接运行在用户的手机上,与运行在服务器后台服务相比,更有可能被黑客攻击. a.网络安全: 1.1 安全地传输用户密码 事先生成一对用于加密的公私钥,客户端登录的时 ...
- iOS-GCD处理后台线程和UI线程的交互
一个例子: 在iPhone上做一个下载网页的功能,就是:在iPhone上放一个按钮,单击按钮时,显示一个转动的圆圈,表示正在进行下载,下载完成后,将内容加载到界面上的一个文本控件上. 使用GCD前: ...
- WordPress的摘要显示方式
WordPress的后台有摘要显示的栏目,如果没有显示,需要设置一下,如图 在列表页现实的内容的时候,一般是有摘要的显示摘要,没有摘要的截取文章的前一部分文字.代码如下 <?php if(has ...
- 【馨儿收藏】群星《2019最新好听DJ舞曲精选》全系列【WAV/在线/百度】(持续更新)
本人作为一名音乐发烧友,一直喜欢追求无损音乐,平时在开发编程无聊的时候,希望享受音乐的过程,追求完美,我这边整理了一系列的比较不错,新的好听的无损音乐,希望大家能够喜欢. [馨儿收藏]群星<20 ...