笔试DAY4

本文整理了编程笔试中涉及的多种算法题目,包括字符串操作、双指针应用、贪心策略、动态规划等。通过鸡鸭分类问题讲解了如何用类双指针解决相邻冲突问题,比特币最佳买卖时间考察了动态规划求最大利润,同时涵盖了贪心算法、二分查找、游戏策略、动态规划解题实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

鸡鸭分类(类双指针)

题目描述:
农场有n只鸡鸭排为一个队伍,鸡用“C”表示,鸭用“D”表示。当鸡鸭挨着时会产生矛盾。需要对所排的队伍进行调整,使鸡鸭各在一边。每次调整只能让相邻的鸡和鸭交换位置,现在需要尽快完成队伍调整,你需要计算出最少需要调整多少次可以让上述情况最少。例如:CCDCC->CCCDC->CCCCD这样就能使之前的两处鸡鸭相邻变为一处鸡鸭相邻,需要调整队形两次。

输入描述:
输入一个长度为N,且只包含C和D的非空字符串。
输出描述:
使得最后仅有一对鸡鸭相邻,最少的交换次数。
在这里插入图片描述

思路:
交换最后得到的结果只有两种,鸡左鸭右,鸭左鸡右
在代码中可以把‘C’都全移到左边或者把‘D’全移到左边,去最小者即可

#include <iostream>
#include <string>
 
using namespace std;
 
int main()
{
   
    string s;
    cin >> s;
    int count = 0;
    int sumC = 0;
    int sumD = 0;
    // 把C往左移
    for(int i = 0; i<s.size(); i++)
    {
   
        if(s[i] == 'C'){
      //单引号
            sumC += i-count++;  //********
        }
    }
 
    // 把D往左移
    count = 0;   //重置
    for(int i = 0; i < s.size(); i++)
    {
   
        if(s[i] == 'D'){
   
            sumD += i-count++;   //********
        }
    }
    cout << min(sumC, sumD) << endl;
    return 0;
}

其中count计数这是第几个c/d(从0开始)i-count为第i个字符需要移动的个数
输入:cin>>“CCDCC”
C左移:
i=0,s[1]=c,sumc=0+0-0;
i=1,s[1]=c,sumc=0+1-1;
i=2,s[2]=d;
i=3,s[3]=c,sumc=0+3-2;
i=4,s[4]=c,sumc=1+4-3=2;
D左移:
i=0,s[1]=c;
i=1,s[1]=c;
i=2,s[2]=d,sumd=0+2-0=2;
i=3,s[3]=c;
i=4,s[4]=c;
输出:cout<<2

比特币最佳买卖时间

题目描述:
给定一个正整数数组,它的第 i 个元素是比特币第 i 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一次),设计一个算法来计算你所能获取的最大利润。注意你不能在买入比特币前卖出。

输入描述:
正整数数组,为以空格分隔的n个正整数
输出描述:
最大利润
在这里插入图片描述
C++中cin的详细用法
ctrl+z结束

#include<bits/stdc++.h>
using namespace std;
 
int main() {
   
    int n, mi = INT_MAX, maxProfit = 0;
    while(cin >> n) {
    //*****
        maxProfit = max(n - mi, maxProfit);
        mi = min(n, mi);
    }
    cout << maxProfit;
    return 0;
}
import java.util.Scanner;
import java.util.ArrayList;
public class Main{
   
    public static void main(String[] args){
   
        Scanner in = new Scanner(System.in);
        ArrayList<Integer> coin=new ArrayList<>();
        while(in.hasNextInt()){
   
            coin.add(in.nextInt());
        }
        Integer[] co=new Integer[coin.size()];
        coin.toArray(co);
        int profit=0;
        for(int i=co.length-1;i>=0;i--)
            for(int j=0;j<i;j++){
   
                profit=Math.max((co[i]-co[j]),profit);
            }
        System.out.println(profit);
    }
}

爱吃喵粮的小猫(贪心)

题目描述:
小招喵喜欢吃喵粮。这里有 N 堆喵粮,第 i 堆中有 p[i] 粒喵粮。喵主人离开了,将在 H 小时后回来。
小招喵可以决定她吃喵粮的速度 K (单位:粒/小时)。每个小时,她将会选择一堆喵粮,从中吃掉 K 粒。如果这堆喵粮少于 K 粒,她将吃掉这堆的所有喵粮,然后这一小时内不会再吃更多的喵粮。

小招喵喜欢慢慢吃,但仍然想在喵主人回来前吃掉所有的喵粮。返回她可以在 H 小时内吃掉所有喵粮的最小速度 K(K 为整数)。

输入描述:
第一行输入为喵粮数组,以空格分隔的N个整数
第二行输入为H小时数
输出描述:
最小速度K
在这里插入图片描述

贪心 + 二分查找
理论最小进食速度: 所有喵粮求和 / 给定的小时数
理论最大进食速度:最大堆的喵粮数
在这两个之间二分查找最小实际可行进食速度即可
注:这是一个lower_bound的二分问题,即求最左边满足条件的值 需要相应修改二分查找

#include <bits/stdc++.h>
using namespace std;
 
vector<int> arr;
int H, tmp, sum = 0, res, mmax = 0, mmin; 
 
bool solve(int x, int H) {
   //x为速度
    int res = 0;//吃完所有猫粮所需时间
    for(int i = 0; i < arr.size(); i++) {
   
        res += (arr[i] % x == 0) ? arr[i] / x: arr[i] / x + 1;
    }
    return res <= H;
}
 
int main() {
   
    string line; getline(cin, line);
    istringstream iss(line);
    while(iss >> tmp) {
   
        arr.push_back(tmp);
        mmax = max(mmax, tmp);
        sum 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值