冬眠(模拟法)

2024-02-19 23:10
文章标签 模拟法 冬眠

本文主要是介绍冬眠(模拟法),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

冬眠

题目描述

麻雀帕西和青蛙弗洛格是好玩伴,它们经常一起比赛唱歌。但冬天来了,青蛙弗洛格冬眠了,它的睡眠深度是 D。麻雀帕西觉得好无聊,于是它想办法要唤醒弗洛格。麻雀帕西只会唱 N 首歌,第 i 首歌的音量是 。每听完一首歌,青蛙弗洛格的睡眠深度就会减少,减少的值等于它听到的歌的音量。当青蛙弗洛格的睡眠深度大于 0 的时候,它会继续冬眠,当睡眠深度小于或者等于 0 时,它就会被唤醒了。麻雀帕西会从第 1 首歌开始唱,唱完第 1 首歌后如果弗洛格还没醒就接着唱第 2 首歌,如果唱完第 2 首歌弗洛格还没醒就接着唱第 3 首歌,依次类推,如果唱完第 N 首歌后弗洛格还没醒,那么麻雀帕西又重新从第 1 首歌开始唱,就像循环播放音乐一样,一直到青蛙弗洛格被唤醒为止,那么麻雀帕西总共唱了多少首歌?

输入格式

第一行,两个整数: D 和 N。
第二行,N个整数,空格分开,第 i 个整数就是第 i 首歌的音量 Si​。

输出格式

一个整数,麻雀帕西总共唱了多少首歌后,弗洛格会被唤醒?

输入样例

13 3
5 2 4

输出样例

4

数据范围

80%的数据:1≤D≤10000,1≤N≤50,1≤Si≤100。
100%的数据:1≤D≤2000000000,1≤N≤50,1≤Si≤10^3。

思路

我们只需要用一个变量来记录麻雀帕西每次唱的歌的音量,使用while循环来判断是否小于D,如果大于,就将麻雀帕西唱歌的次数加1,否则,就输出麻雀帕西唱歌的次数。

代码

#include<bits/stdc++.h>
using namespace std;
int a[55],ans,cnt;//ans是麻雀帕西唱歌的声音总和,cnt是麻雀帕西唱歌的次数
int main(){int n,s;//s是青蛙弗洛格的睡眠深度cin>>s>>n;for(int i=1;i<=n;i++)cin>>a[i];int i=1;while(ans<=s){ans+=a[i];cnt++;i++;if(i%n==0)//如果进入下一轮,将i设为1(因为在我的代码中下标是从1开始的)i=1;}cout<<cnt; //输出答案return 0;
}

But……

很好,这个代码光荣的TLE了

emm……,经过我漫长的撕烤以后,发现:100%的数据:1≤D≤2000000000。

!!!撕烤一下,如果所有的Ai全都为1的这种极端情况下会运行2000000000次……

so,经过我的修改,诞生了这篇代码:

#include<bits/stdc++.h>
using namespace std;
int a[55],ans,cnt,res;
int main(){int n,s;cin>>s>>n;for(int i=1;i<=n;i++){cin>>a[i];res+=a[i];}if(s>res);cnt=s/res;s%=res;cnt*=n;int i=1;while(s>0){s-=a[i];cnt++;i++;if(i==n)i=1;}cout<<cnt; return 0;
}

But……

                                    

他喵的!!!

终于~~~~~~

我找到了问题所在:

i++;
if(i==n)i=1;

这个部分应该改为

if(i==n)i=1;
else i++;

否则他就会越界

最后贴上正确代码:

#include<bits/stdc++.h>
using namespace std;
int a[55],ans,cnt,res;
int main(){int n,s;cin>>s>>n;for(int i=1;i<=n;i++){cin>>a[i];res+=a[i];}cnt=s/res*n;s%=res;int i=1;while(s>0){s-=a[i];if(i==n)i=1;else i++;cnt++;}cout<<cnt;return 0;
}

这篇关于冬眠(模拟法)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/726289

相关文章

【数学建模】自动化车床管理(蒙特卡洛模拟法)

1999年全国大学生数学建模竞赛题目A question1假设检验建立模型重新建立模型随机化求解 自动化车床管理 一道工序用自动化车床连续加工某种零件,由于刀具损坏等原因该工序会出现故障,其中刀 具损坏故障占 95%, 其它故障仅占 5%。工序出现故障是完全随机的, 假定在生产任一零件时出现故障的机会均相同。工作人员通过检查零件来确定工序是否出现故障。 现积累有 10

题目2693:蓝桥杯2022年第十三届决赛真题-卡牌【排序模拟法图解】

😎卡牌 这道题是最近难得独立想出来的一道题目,从题目到代码没有看过题解, 全是自己的思路 🥰自制动画–过程演示 🤔大致思路 定义每个卡牌为结构体 struct card {int a;int b;}; 有两个属性,a表示该卡牌的数量, b表示空卡牌使用次数上限。 根据规律,我们先将所有卡牌按照a的值进行排序: sort(cards.begin(), cards.e

算法设计与分析 第三章——模拟法鸡兔同笼问题c++代码

3.1.2 一个简单的例子:鸡兔同笼问题 【问题】笼子里有若干只鸡和兔子,鸡有两只脚,兔子有四只脚,没有例外情况。已知笼子里脚的数量,问笼子里至多有多少只动物?至少有多少只动物? 【想法】对于同样数目的动物,鸡脚的总数肯定比兔子脚的总数要少,因此在计算笼子里至多有多少只动物时,应该把脚都算作鸡脚,在计算笼子里至少有多少只动物时,应该尽可能把脚都算作兔子脚。 【算法】 设函数 Feets 实现鸡

C/C++蓝桥杯之模拟法问题

模拟法,顾名思义,就是利用计算机模拟问题的求解过程,从而得到问题的解,模拟法由于简单,因此又被称为"不是算法的算法"。 模拟法是学习算法的基础,通过模拟可以学习编程的各类技巧,提升初学者建立各种编程逻辑模型的感觉。大部分模拟题目直接模拟就可以求解,还有少量模拟题目需要考生简化模拟过程,否则可能会使逻辑复杂,导致求解用时过长。 模拟法适用于问题求解,清晰运算规模较小的问题。如果问题求解的时空代价

冬眠...

链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网   阿宁生活在一个 nnn 行 mmm 列的字符矩阵中,阿宁打算在第 xxx 行 yyy 列冬眠。 在每一天,都会有 qqq 次行循环移动或列循环移动。 如果是第 zzz 行循环移动,那么第 zzz 行所有字符往后移动一个,最后一个字符移动到第 zzz 行开头。 如果是第 zzz 列循环移动,那么第 zzz 列所有字符往后移动一个,最

字符串与模拟法

加密英文 输入一个字符串可用getline(cin,数组名)  字典序  在字符串中寻找子字符串 分糖果  代码 猴子选大王  代码 如果n号猴子被选中,则使得n号的猴子变成false,未出局的猴子为true。 if(p==n+1) p=1;这个是将超出的下标重新变回1号,使其重新循环。 辛德瑞拉的项链  代码 字符串长度:数组名.size()

matlab模拟积分,MATLAB学习笔记:随机模拟法计算数值积分

>> x=unifrnd(-2*pi,2*pi,10000,1); >> f=(1-x.^2).*sin(5*x); >> fmax=max(f) fmax = 34.711289618412117 随机模拟法求定积分: 数值积分: >> f=inline('exp(x.^2+1)','x'); >> quad(f,0,1) ans = 3.975899680849105 随机模拟法: