2021年暑期训练阶段四Day1

本文介绍了几个编程竞赛中的难题,包括使用二分法解决的汉堡制作、河中石子移除和杯子高度计算问题,还有利用矩阵快速幂求斐波那契数列的最后四位,以及其它几种不同思路的解题方法。
摘要由CSDN通过智能技术生成

目录

A - Hamburgers

B - River Hopscotch

C - Cup

D - Fibonacci

E - Dating with girls(1)

F - Median

G - sort


A - Hamburgers

题意:

Polycarpus非常喜欢汉堡包。他特别喜欢自己亲手做的汉堡包。Polycarpus认为制作汉堡包的原料只有三种:面包、香肠和奶酪。他用一串字母“B”(面包)、“S”(香肠)和“C”(奶酪)写下他最喜欢的“Polycarpus汉堡”的食谱。配方中的成分从下到上,例如,配方“B SCBS”代表汉堡,其中成分从下到上依次为面包、香肠、奶酪、面包和香肠。

Polycarpus在厨房里有nb块面包、ns块香肠和nc块奶酪。此外,附近的商店有三种配料,一片面包的价格是pb卢布,一片香肠的价格是ps,一片奶酪的价格是pc。

Polycarpus有r卢布,他准备在上面购物。他最多能做多少个汉堡包?你可以假设Polycarpus不能将任何一片面包、香肠或奶酪弄碎或切片。此外,该店每种配料的数量不限。

思路:

看到这种题目就立刻想到二分了,二分最多做几个汉堡然后判断钱够不够就可以了,注意有的材料可能不被用到,直接模拟也行

代码:

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
#define ll long long

double PI = acos(-1.0);
double eps=1e-5;


char b[101];
ll nb, ns, nc;
int pb, ps, pc;
ll r;//卢布数

int lb = 0, ls = 0, lc = 0;
bool check(ll mid)
{
    ll rr = r;
    ll b=lb*mid;
    ll s=ls*mid;
    ll c=lc*mid;
    if(nb<b)  //不足
    {
        rr-=(b-nb)*pb;
    }
    if(ns<s)  //不足
    {
        rr-=(s-ns)*ps;
    }
    if(nc<c)  //不足
    {
        rr-=(c-nc)*pc;
    }
    if(rr>=0)
        return true;
    if(rr<0)
        return false;
}
int main(void)
{
    int len;
    scanf("%s",b);
    len=strlen(b);
    for(int i=0; i<len; i++)
    {
        if(b[i]=='B')
            lb++;
        else if(b[i]=='S')
            ls++;
        else if(b[i]=='C')
            lc++;
    }
    cin>>nb>>ns>>nc;
    cin>>pb>>ps>>pc;
    cin>>r;
    ll right=r+nb+ns+nc;
    ll left=0;
    ll mid=0;
    while(right>left)
    {
        mid=(left+right+1)/2;//(3+3+1)/2=3;(3+4+1)/2=4;使相差为1的两个数凑高,相同的两个数结果不变
        int mark=check(mid);
        if(mark==true) //mid偏小
            left = mid ;
        if(mark==false)//mid偏大
            right=mid-1 ;
    }
    mid=(left+right+1)/2;//再更新一次,不然不是最新值
    cout<<mid<<endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值