动态规划【牛客日记】

有假币

有假币

居然有假币! 现在猪肉涨了,但是农民的工资却不见涨啊,没钱怎么买猪肉啊。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);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
动态规划在解决牛客删除括号问题时,可以按照以下步骤进行: 1. 首先,我们需要理解题目的需求。题目要求我们删除括号,使得剩下的字符串满足以下条件:左括号和右括号的数量相等,且左括号的位置必须在右括号的前面。 2. 接下来,我们可以使用动态规划来解决这个问题。我们可以定义一个三维的dp数组,其中dp[q][w][e]表示考虑s前q个字符,t前w个字符,且s被删除部分左括号数减去右括号数为e时,是否可行(bool类型)。 3. 然后,我们可以从前向后遍历字符串s和t。在每一步中,我们可以考虑两种情况: a. 删除的左括号数目比右括号多:我们可以继续删除左括号,或者删除右括号。即dp[q][w][e] = dp[q-1][w][e+1]或dp[q-1][w][e-1]。 b. 删除的左括号数目与右括号数目相同:我们只能删除右括号。即dp[q][w][e] = dp[q-1][w-1][e-1]。 4. 最后,我们可以根据dp[len1][len2][0]的值来判断是否可行。其中len1和len2分别表示字符串s和t的长度。 综上所述,通过动态规划的思路,我们可以解决牛客删除括号的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [动态规划笔记](https://download.csdn.net/download/weixin_38617297/13751806)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [牛客_21303删括号_动态规划](https://blog.csdn.net/weixin_45619006/article/details/114650172)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孙宇航_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值