动态规划【牛客日记】

有假币

有假币

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

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


输出描述:
最多要称几次一定能把那个假币找出来?
示例1
输入
3
12
0
输出
1
3

也就是给你一个天平(天平两端可以容纳无限个硬币),请用最快的时间找出假币。
我觉得要想最快就是把钱币分为三堆 A B C
先拿 A B 上天平
如果 A<B,那么假币在A
如果 A>B,那么假币在B
如果 A=B,那么假币在C
最快的时间就是分为三堆来找
最多需要称几次,那就是最坏情况下假币都在三份中最多的里面。

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    
    
    public static void main(String[] args) {
    
    
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) {
    
     // 注意 while 处理多个 case
            int n = in.nextInt();
            if(n==0) break;
            int count = 0;
            while(n>=2){
    
    
                n = (int)Math.ceil((double)n/3);
                count++;
            }
            System.out.println(count);
        }
    }
}

最难的问题

最难的问题

NowCoder生活在充满危险和阴谋的年代。为了生存,他首次发明了密码,用于军队的消息传递。假设你是军团中的一名军官,需要把发送来的消息破译出来、并提
供给你的将军。 消息加密的办法是:对消息原文中的每个字母,分别用该字母之后的第5个字母替换(例如:消息原文中的每个字母A
都分别替换成字母F),其他字符不 变,并且消息原文的所有字母都是大写的。密码中的字母与原文中的字母对应关系如下。
在这里插入图片描述
输入描述: 输入包括多组数据,每组数据一行,为收到的密文。 密文仅有空格和大写字母组成。
在这里插入图片描述

输入密码,输出原文。
可以看出相当于对密码中的每一个字符进行“减5”操作
但是有题目可以看出 如果是E之后的字符,可以直接进行“减5”操作,但是对于ABCDE怎么进行“减5”操作呢?
简单的分析一下:
A 减5 V 0–>21
B 减5 W 1–>22
可以看出是对 ABCDE进行 “加21”操作即可。
所以我们可以看出

str[i] <=E      i+21
str[i] > E      i-5
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    
    
    public static void main(String[] args) {
    
    
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNext()) {
    
     // 注意 while 处理多个 case
           String str = in.nextLine();
           StringBuilder sb = new StringBuilder();
           for(int i = 0;i<str.length();i++){
    
    
            char c = str.charAt(i);
            if(c == ' '){
    
    
                sb.append(" ");
            }else{
    
    
                sb.append((char)(c>'E'?c-5:c+21));
            }
           }
           System.out.println(sb);
        }
    }
}

因子个数

因子个数

一个正整数可以分解成一个或多个数组的积。例如36=223*3,即包含2和3两个因子。NowCoder最近在研究因子个数的分布规律,现在给出一系列正整数,他希望你开发一个程序输出每个正整数的因子个数。
在这里插入图片描述

输入一个数,要找它的因子,而且我们希望找的快。
首先得确定一个范围:
如果有 n = X * Y  如果 X <= Y ,那么X一定是 在2-根号n的范围内,也就是在2-根号n的范围内
一定会找到n因子
那么我们就可以这样操作,for循环遍历 2-根号n 范围
	if(n%i==0) 就是在这个范围中是n的因子的话,那么对n进行n/i操作,只要n%i==0就继续执行
	比如 n=36 36%2==0 那么就继续 36/2=18 继续判断 18%2==0 18/2=9 此时不断除以2
	这个2相当于因子,可以进行count++操作
遍历完成后,此时的n如果等于1的话,说明所有的因子都找到了 直接输出
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    
    
    public static void main(String[] args) {
    
    
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) {
    
     // 注意 while 处理多个 case
            int n = in.nextInt();
            int count = 0;
            for(int i =2 ;i*i<=n;i++){
    
    
                if(n%i==0){
    
    
                    while(n%i==0){
    
    
                        n /= i;
                    }
                    count++;
                }
            }
            if(n!=1){
    
    
                count++;
            }
            System.out.println(count);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_53939785/article/details/129955914