鸡鸭分类(类双指针)
题目描述:
农场有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