买糖果问题

本文介绍了一道关于模拟购买糖果的编程题目,并给出了高效的解决方案。通过优化算法避免了大规模的数据处理带来的性能瓶颈,实现了时间复杂度为O(nlogt)级别的高效计算。

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

n 个糖果店,围成一圈。

店铺按顺时针顺序从 1 到 n 编号,n 号店铺与 1 号店铺相邻。

第 i 号店铺的单个糖果售价为 ai 元。

李华拿着 T 元钱去购买糖果,具体购买过程如下:

初始时,他位于 1 号店铺。
如果他现有的钱足够在当前店铺购买一个糖果,他就会立即购买一个糖果,否则他将不会在当前店铺购买糖果。随后,不论他是否在当前店铺购买糖果,他都会按顺时针顺序前往下一个店铺。
他将不断重复过程 2,直到剩余的钱在所有店铺都买不起糖果为止。
请问,最终李华一共购买到多少个糖果。

输入格式
第一行包含两个整数 n,T。

第二行包含 n 个整数 a1,a2,…,an。

输出格式
一个整数,表示一共购买到的糖果数量。

数据范围
前 6 个测试点满足 1≤n≤10。
所有测试点满足 1≤n≤2×10^5,1≤T≤10^18,1≤ai≤10^9。

问题分析:具体的题意用代码都可以模拟出来,就是数据量大,O(n*(T/sum))量级会超时,要考虑优化问题。

……

有个小知识点:a>b>0,则有a%b<a/2

证明:首先当a>b>=a/2时,a%b<a/2;

其次if b<a/2时,a%b<b<a/2;

综上,a%b<a/2

……

Code:

#include<iostream>
using namespace std;
const int N=2e5+10;
int a[N];
int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);
    unsigned long long n,t;
    cin>>n>>t;
   unsigned long long res=0;
    for(int i=1;i<=n;++i){
        cin>>a[i];
    }
    
    while(true){
       unsigned long long cnt=0,all=0;
        for(int i=1;i<=n;++i){
           if(a[i]==-1)continue;
            if(t>=a[i]+all){
                all+=a[i];
                cnt++;
            }
            else{
                a[i]=-1;
            }
        }
        if(!all)break;
     res+=cnt*(t/all);
    t%=all;
    }
    cout<<res;
}

t%all<t/2,每次都可以把t变成<t/2,时间复杂度为O(nlogt)级别不超时

### C语言糖果问题的程序代码实现 以下是使用C语言编写的糖果问题的程序代码。此代码基于用户输入的条件,模拟购糖果的过程并输出最终结果。 ```c #include <stdio.h> int main() { int total_candies = 0; // 总糖果数 int price_per_candy, money_available, candies_bought; // 输入糖果单价和可用资金 printf("请输入糖果的单价和您拥有的资金(以空格分隔):"); scanf("%d %d", &price_per_candy, &money_available); // 计算可以购糖果数量 if (price_per_candy > 0 && money_available >= 0) { candies_bought = money_available / price_per_candy; total_candies += candies_bought; // 输出购结果 printf("您可以购 %d 颗糖果。\n", candies_bought); printf("余资金为 %d 。\n", money_available % price_per_candy); } else { printf("输入无效,请确保单价大于0且资金非负数。\n"); } return 0; } ``` 此代码实现了根据用户输入的糖果单价和可用资金计算可购糖果的数量,并输出余资金。如果输入的单价或资金无效,则会提示错误信息[^2]。 #### 程序逻辑说明 - 用户需要输入糖果的单价和可用资金。 - 程序通过整数除法计算能够购的最大糖果数量。 - 余资金通过取模运算得出。 - 如果输入的单价小于等于0或资金为负数,则会提示输入无效[^2]。 #### 示例运行 假设糖果单价为5,用户有37资金: ```plaintext 请输入糖果的单价和您拥有的资金(以空格分隔):5 37 您可以购 7 颗糖果余资金为 2 。 ``` 如果输入无效数据,例如单价为0或资金为负数: ```plaintext 请输入糖果的单价和您拥有的资金(以空格分隔):0 100 输入无效,请确保单价大于0且资金非负数。 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值