精华内容
下载资源
问答
  • 最小正数(贪心)

    2019-03-07 13:14:45
    原题: 给定一个十进制正整数n(0 < n < 1000000000),每个数位...例如: n = 9128456, k = 2, 则生成新整数最小为12456 Input 第一行t, 表示t组数据; 接下来t行,每一行表示一组测试数...

    原题:

    给定一个十进制正整数n(0 < n < 1000000000),每个数位上数字均不为0。n的位数为m。 现在从m位中***删除k位***(0<k < m),求生成的新整数最小为多少? (注意这里是删除,不是重排)
    例如: n = 9128456, k = 2, 则生成的新整数最小为12456
    Input 第一行t, 表示有t组数据; 接下来t行,每一行表示一组测试数据,每组测试数据包含两个数字n, k。
    Output t行,每行一个数字,表示从n中删除k位后得到的最小整数。 Sample Input 2 9128456 2 1444 3 Sample Output 12456 1

    分析:最终得到的数有m-k位,那么贪心的策略可以是:先使m-k位上的数字最小,再使m-k-1上的最小,如此下去,直到到了个位。
    伪代码有点难写,写一下大致流程吧:
    1.以字符串为处理对象,输入为字符串s[],输出为字符串ans[];
    2.以n=9128456为例,m=7,k=2,s[0]=‘9’,s[1]=‘1’, … ,s[6]=‘6’,最终的数有m-k=5位。由于原题要求是删除,所以我们只能够从n的第7位到第5位检索最小的数,找到后位置标记为flag,再从flag+1到第4位检索,重复操作,直至第1位,即个位。观察到k=2时,s[k]即为第5位,s[k+1]即为第4位,因此,我们可以以k为对象,设置一个循坏,循坏结束标记是k>m-1。

    代码如下:

    #include<cstdio>
    #include<cstring>
    using namespace std;
    int main()
    {
    	int t,m,k,flag;
    	char s[15],ans[15],c;
    	int i,j;
    	scanf("%d",&t);
    	while(t--)
    	{
    		flag=j=0;
    		scanf("%s %d",s,&k);
    		m=strlen(s)-1;
    		while(k<=m)    //以k为循坏处理对象
    		{
    				for(i=flag;i<=k;i++)
    				{
    					if(i==flag) c=s[i];
    					else if(c>s[i]){
    				    	c=s[i];flag=i;
    				    }
    				}
    				ans[j++]=c;
    				flag++;k++;  //flag要加1,k也要递增1
    		//	printf("%c %d\n",c,flag);
    		}ans[j]='\0';
    		printf("%s\n",ans);
    	}
    	return 0;
    }
    

    代码写得挺简洁的,应好好参考。

    展开全文
  • 中午无聊做了一道算法题,题意为在一个既负数又有正数的升序数组中,找出其绝对值最小的数 思想:  本体可用二分搜索进行查找,先找出中间的一个数,如果是正数,则在负数一边继续进行查找,若是负数,则在正数一边...

    中午无聊做了一道算法题,题意为在一个既有负数又有正数的升序数组中,找出其绝对值最小的数

    思想:

           本体可用二分搜索进行查找,先找出中间的一个数,如果是正数,则在负数一边继续进行查找,若是负数,则在正数一边继续进行查找,知道找到目标数位置

     

    展开全文
  • nowcoder这就去买猪肉,结果找来零钱中假币!!!可惜nowcoder 一不小心把它混进了一堆真币里面去了。只知道假币重量比真币质量要轻,给你一个天平(天平两端能容纳无限个硬币),请用最快时间把那个可恶...

    有假币

    题目描述:

    居然有假币!
    现在猪肉涨了,但是农民的工资却不见涨啊,没钱怎么买猪肉啊。nowcoder这就去买猪肉,结果找来的零钱中有假币!!!可惜nowcoder
    一不小心把它混进了一堆真币里面去了。只知道假币的重量比真币的质量要轻,给你一个天平(天平两端能容纳无限个硬币),请用最快的时间把那个可恶的假币找出来。

    输入描述: 1≤n≤2^30,输入0结束程序。

    输出描述: 最多要称几次一定能把那个假币找出来?

    题解:

    要找到一堆货币中的假币,最快的方式是分3堆,使用其中两堆称重即可:
    假币比真币轻,所以:
    (1) 如果A<B,那么假币在A
    (2)如果A>B,那么假币在B
    (3) 如果A=B,那么假币在C
    以上将一堆货币分为三份,是最快找到假币的方式
    题目问最多需要称几次,那么最坏的情况就是假币每次都在三份最多的那份里边
    对于n个货币,n的范围为[1,2^30],每次分三份,找最多的那份,即为n/3向上取整。
    如n=4,则分为1, 1, 2,取最多的2 n=5,则分为2,2,1,取最多的2 .

    解题思路:
    在这里插入图片描述
    以上需要解决n/3向上取整的问题
    可以使用Math.ceil()方法
    在这里插入图片描述

    需要注意,n/3 是int/ int,返回值也是int,小数已经丢失了
    应该使用: (double)n/3 返回-个浮点数,再作为参数传入Math.ceil()方法
    即: Math.cil(double)n/3)

    import java.util.*;
    public class Main{
        public static void main(String[] args){
            Scanner scan=new Scanner(System.in);
            while(scan.hasNext()){
                int n=scan.nextInt();
                if(n==0) break;
                int count=0;
                while(n>=2){
                    n=(int)Math.ceil((double)n/3);
                    count++;
                }
                System.out.println(count);
            }
           
        }
    }
    

    求正数数组的最小不可组成和

    给定一个全是正数的数组arr,定义一下arr的最小不可组成和的概念:
    1,arr的所有非空子集中,把每个子集内的所有元素加起来会出现很多的值,其中最小的记为min,最大的记为max;
    2,在区间[min,max]上,如果有一些正数不可以被arr某一个子集相加得到,那么这些正数中最小的那个,就是arr的最小不可组成和;
    3,在区间[min,max]上,如果所有的数都可以被arr的某一个子集相加得到,那么max+1是arr的最小不可组成和;
    举例: arr = {3,2,5} arr的min为2,max为10,在区间[2,10]上,4是不能被任何一个子集相加得到的值中最小的,所以4是arr的最小不可组成和; arr = {3,2,4} arr的min为2,max为9,在区间[2,9]上,8是不能被任何一个子集相加得到的值中最小的,所以8是arr的最小不可组成和; arr = {3,1,2} arr的min为1,max为6,在区间[2,6]上,任何数都可以被某一个子集相加得到,所以7是arr的最小不可组成和;
    请写函数返回arr的最小不可组成和。

    题解:
    在这里插入图片描述
    要满足子集和为j, arr 数组中每个元素只有一种可能,包含在其中子集中,或不包含:
    如果arr[0] - arr[i]有子集和j,如果arr[i]在某个子集中,那么可以推出以下结论:
    数组arr中,对非arr[i]的其他元素所组成的子集进行求和,- -定存在j-arr[i]这个子集和

    解题思路:
    先把能满足的子集和找到: arr[i]=j
    再递推:如果f(j-arr[i])= true,那么对arr[i]元素来说,满足f(j)= true
    对于题解来说,可以让arr[i]=j时,也满足f(j-arr[i]) = true,即f(0)=true
    每次只是更新f(j)的值即可。如果f(j)=true,不需要更新,如果为false,更新为f(j-arr[i]) 的值

    public class Solution {
    	/**
    	 *	正数数组中的最小不可组成和
    	 *	输入:正数数组arr
    	 *	返回:正数数组中的最小不可组成和
    	 */
    	public int getFirstUnFormedNum(int[] arr) {
              int min=Integer.MAX_VALUE;
              int max=0;
            for(int i=0;i<arr.length;i++){
                max+=arr[i];
                min=Math.min(min,arr[i]);
            }
            
            boolean[] result=new boolean[max+1];
           result[0]=true;
            for(int i=0;i<arr.length;i++){
                for(int j=max;j>=arr[i];j--){
                   result[j]=result[j-arr[i]] || result[j];
                }
            }
            for(int i=min;i<result.length;i++){
                if(!result[i])
                    return i;
            }
                return max+1;
            
    	}
    }
    
    展开全文
  • 2,在区间[min,max]上,如果一些正数不可以被arr某一个子集相加得到,那么这些正数最小的那个,就是arr的最小不可组成和; 3,在区间[min,max]上,如果所有的数都可以被arr的某一个子集相加得到,那

    给定一个全是正数的数组arr,定义一下arr的最小不可组成和的概念: 1,arr的所有非空子集中,把每个子集内的所有元素加起来会出现很多的值,其中最小的记为min,最大的记为max; 2,在区间[min,max]上,如果有一些正数不可以被arr某一个子集相加得到,那么这些正数中最小的那个,就是arr的最小不可组成和; 3,在区间[min,max]上,如果所有的数都可以被arr的某一个子集相加得到,那么max+1是arr的最小不可组成和; 举例: arr = {3,2,5} arr的min为2,max为10,在区间[2,10]上,4是不能被任何一个子集相加得到的值中最小的,所以4是arr的最小不可组成和; arr = {3,2,4} arr的min为2,max为9,在区间[2,9]上,8是不能被任何一个子集相加得到的值中最小的,所以8是arr的最小不可组成和; arr = {3,1,2} arr的min为1,max为6,在区间[2,6]上,任何数都可以被某一个子集相加得到,所以7是arr的最小不可组成和; 请写函数返回arr的最小不可组成和。

    public class Solution {
    
        /**
         * 正数数组中的最小不可组成和 输入:正数数组arr 返回:正数数组中的最小不可组成和
         */
        public static int getFirstUnFormedNum(int[] arr) {
            int max = arr[0];
    
            for (int i = 1; i < arr.length; i++) {
                max += arr[i];
            }
            for (int i = 0; i < arr.length; i++) {
                for (int j = 0; j + 1 < arr.length - i; j++) {
                    if (arr[j] > arr[j + 1]) {
                        int temp = arr[j];
                        arr[j] = arr[j + 1];
                        arr[j + 1] = temp;
                    }
                }
            }
            int min = arr[0];
            int m[][] = new int[arr.length + 1][max + 1];
    
            for (int j = min; j < max + 1; j++){
                for (int i = 1; i < arr.length + 1; i++) {
                    if (arr[i-1] <= j) {
                        m[i][j] = Math.max(m[i - 1][j - arr[i-1]] + arr[i-1], m[i - 1][j]);
                    } else {
                        m[i][j] = m[i - 1][j];
                    }
                }
                if(m[arr.length][j]!=j){
                    return j;
                }
            }
            return max+1;
    
        }
    
        public static void main(String[] args) {
            int[] arr = { 2, 3, 5 };
            System.out.println(Solution.getFirstUnFormedNum(arr));;
        }
    
    }
    展开全文
  • max]上,如果一些正数不可以被arr某一个子集相加得到,那么 这些正数最小的那个,就是arr的最小不可组成和; 3,在区间[min, max]上,如果所有的数都可以被arr的某一个子集相加得到,那么 max + 1是arr的最小不...
  • 青蛙约会Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 50990 Accepted: 7487 Description两只青蛙在网上相识了,它们聊得很开心,于是觉得很必要见一面。它们很高兴地发现它们住在同一条...
  • 2,在区间[min,max]上,如果一些正数不可以被arr某一个子集相加得到,那么这些正数最小的那个,就是arr的最小不可组成和; 3,在区间[min,max]上,如果所有的数都可以被arr的某一个子集相加得到,那么max+1是...
  • 2,在区间[min,max]上,如果一些正数不可以被arr某一个子集相加得到,那么这些正数最小的那个,就是arr的最小不可组成和; 3,在区间[min,max]上,如果所有的数都可以被arr的某一个子集相加得到,那
  • 2,在区间[min,max]上,如果一些正数不可以被arr某一个子集相加得到,那么这些正数最小的那个,就是arr的最小不可组成和; 3,在区间[min,max]上,如果所有的数都可以被arr的某一个子集相加得
  • 给定一个未排序的整数数组,找到最小的缺失正整数。 最小数是从1开始。 思路: 首先,O(N)时间复杂度的方法:遍历整个数组,然后将每个数放入它对应的那一个位置,1放入 a[0] 中,就是给他们交换位置,并且在该...
  • 两只青蛙,青蛙A和青蛙B,它们在一个首尾相接数轴上。设青蛙A出发点坐标是x,青蛙B出发点坐标是y。青蛙A一次能跳m米,青蛙B一次能跳n米,两只青蛙跳一次所花费时间相同。数轴总长L米。要求它们至少跳了几...
  • [摘要]证明了:有最小正数;已知实数轴R点有大小;实数与R点远不可一一对应。从而推翻了百年集论立论论据,使2500年芝诺著名运动世界难题迎刃而解。指出线段(0,k)与(0,k)(0与k>0之间所有数组成集)...
  • 一句话纠正几千年重大错误:无最小正数————从西方传进来数学违反起码数学常识定理黄小宁通讯:广州市华南师大南区9-303第二信箱 邮编510631 “假传万卷书,真传一句话”:同沿数轴运动不断靠近两点...
  • 1. 题目来源 链接:求正数数组的最小不可组成和 来源:牛客网 ... 2,在区间[min,max]上,如果一些正数不可以被arr某一个子集相加得到,那么这些正数最小的那个,就是arr的最小不可组成和; ...
  • 正数数组的最小不可组成和(动态规划:01背包问题) 题目描述: 动态规划:01背包问题(无物品价值) 思想相同,题目最终要求有些变化 min为最轻物品重量,sum为所有物品总重量 假设一个能装入容量为C(C在[min,...
  • 假设一个能装入容量为C(C在[min,sum]间取值)背包和n件重量分别为w1,w2,…,wn物品,能否从n件物品中挑选若干件恰好装满背包,要求输出不满足条件的最小容量。 该题要求数组的最小不可组成和,例如arr = {3,2,...
  • 今天申请了博客园账号,在下班后阅览博客时发现了一个关于百度面试题探讨博客(其实是个很基础... 其中下面人评论为:  有序列表查找显然二分啊,博主貌似对javaarrays和collections不是很熟。 private ...
  • 思路很简单,找出最大正数最小正数,然后建立一个数组visit,记录从最小正数到最大正数之间哪些数,哪些数没有。最后遍历一下visit就行了。不过visit长度需要注意一下。举个简单例子,nums = [1,4,5,1000]。...
  • 41. 缺失第一个正数

    2018-09-21 12:45:55
    给定一个未排序的整数数组,找出其中没有出现的最小的正整数。 ... 如果数组中正数,找出最小的正数,如果大于1则返回1,如果=1的话判断数组中它之后的正数和它是否连续,不连续则找出第一个...
  • 判断缺失数字是在左边、右边条件是,所有正数的个数 与(最大正数-最小整数)大小关系,但是,这隐含了正数不重复出现条件,所以这个方法问题。 class Solution: def firstMissingPositive(se
  • 题目描述 给你一个未排序的整数数组 nums ,请你找出其中没有出现的...1、缺失的正数落 在[1,n]中间,意味着,数组中必然不在[1,n]的数字或在[1,n]范围内的重复数字。 2、缺失的正数大小超出了n,说明数组必然包括
  • 但是他并不满足于此,他在想究竟多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? ...
  • 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。 思路一:对数组排序,然后遍历,找到第一个是正数的索引下标。如果这个正数不是1,那我们就直接返回1。如果是1,我们就分析,如果后续相邻...
  • 个很奇妙的思路就是,数组中的数虽然不都是1到n的,但要求的数是在1到n之间的,因为如果要求的数都不在数组中,那最小的正数只能是n了。所以遍历数组,如果发现这个数在1到n之间,就可以将它放到正确的位置,当...
  • 文章目录题目题目解析解题代码 题目 题目解析 乍一看,可能很多人一下...搞清楚这个之前,得搞清楚题意,题意是要找出连续的正数中缺失的最小正数,那么我们就可以得出我们所要找的这个最小正数的最大值和最小值,最
  • 给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。 示例1: 输入: [1,2,0] 输出: 3 示例2: 输入: [3,4,-1,1] 输出: 2 示例3: 输入: [7,8,9,11,12] 输出: 1 思路就是把特殊区域找出来,...
  • 缺失第一个正数

    2021-03-05 16:29:19
    给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。 进阶:你可以实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案吗? 示例 1 输入:nums = [1,2,0] 输出:3 示例 2: 输入:nums ...
  • int的负数比正数多一个,则一个负数在int范围内没有对应的正数 最大正整数用十六进制,很容易表示:0x7f ff ff ff int num = 0x7fffffff; num = -num; printf("%d\n", num); printf("%d\n", -num); ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 851
精华内容 340
关键字:

有最小的正数