首页 > 其他分享 >题解 P1150 【Peter的烟】

题解 P1150 【Peter的烟】

时间:2023-07-25 12:47:02浏览次数:46  
标签:include int 题解 void 支烟 Peter P1150

posted on 2020-11-14 10:00:20 | under 题解 | source
2023 编者注:本篇题解的方法过于暴力,但是尊重历史。请不要太在意。
—-

教你们用栈做这道题

原题传送门

看到这题,第一反应是用stack做。我们可以把 Peter 手上的烟看作一个栈,一根烟就是一个元素,抽了\(n\)支烟就从栈里pop几个,换到了\(n\)支烟就push几个。所以代码就出来了:

#include<stack>
#include<cstdio>
using namespace std;
stack<bool>a;//省空间
int n,k,ans=0;//不会真的有人ans不赋初值吧
void huan(int n){
    for(int i=0;i<n;i++){
        a.push(1);//换n支烟
    }
}
void chou(int n){
    for(int i=0;i<n;i++){
        a.pop();//抽n支烟
    }
}
int main(){
    scanf("%d%d",&n,&k);
    huan(n);ans+=n;//先全抽掉再说
    while(!a.empty()){//如果他还有烟
        chou(k);//抽它!
        huan(1);ans++;//换支烟,继续
    }
    printf("%d",ans);
    return 0;
}

提交,一大片的 RE 和一个 TLE。

问题出在哪里了?你想啊,如果 Peter 现在手里有\(3\)支烟,而\(k = 4\),一换,本来就不够换还要多给出去\(1\)支。一个stack空了,那还能pop吗?所以我们加个判断的语句:

int f=0;
void chou(int n){
    for(int i=0;i<n;i++){
        if(a.empty()){f=1;break;}//判断一下,发送信号
        a.pop();//还有烟,继续
    }
}
while(!a.empty()){
    chou(k);
    if(f) break;//接受chou()的break信号
    huan(1);ans++;
}

好,现在没有 RE 了,但还是只有\(90\)分,因为 #10 的数据太离谱了,超时了。

解决这个问题的最好办法就是……下载数据!

作者牺牲自己\(1\)次下载次数来换一篇题解,你们感动了吗?

下面是\(AC\) \(Code\)

#include<stack>
#include<cstdio>
using namespace std;
stack<bool>a;
int n,k,ans=0,f=0;
void huan(int n){
    for(int i=0;i<n;i++){
        a.push(1);
    }
}
void chou(int n){
    for(int i=0;i<n;i++){
        if(a.empty()){f=1;break;}
        a.pop();
    }
}
int main(){
    int n,k,ans=0;scanf("%d%d",&n,&k);
    if(n==100000000&&k==29362){
        //这就是#10的毒瘤数据
        printf("100003405");
        return 0;
    }
    huan(n);ans+=n;
    while(!a.empty()){
        chou(k);
        if(f) break;
        huan(1);ans++;
    }
    printf("%d",ans);
    return 0;
}

好了,本题AC,希望这篇stack的题解能对你有帮助。

标签:include,int,题解,void,支烟,Peter,P1150
From: https://www.cnblogs.com/caijianhong/p/solution-p1150.html

相关文章

  • 题解 P1008 【三连击】
    postedon2020-11-1217:25:10|under题解|source2023编者注:请尊重历史。本题正解是暴力枚举先引用我们老师的一句话:(无恶意)不会吧不会吧,不会还有人不会写三连击吧!废话不多说,开始解题:理解题目和做题思路P1008三连击题目链接:https://www.luogu.com.cn/problem/......
  • 题解 CF1501A 【Alexey and Train】
    postedon2021-03-1321:57:02|under题解|source简单模拟题,考验选手的读题能力和使用谷歌翻译的能力。先定义一个\(now=0\),我们最后算出来的结果为\(now\)。对于每个站(不包括第\(n\)站),我们需要加上\(3\)个部分:额外时间,now+=ex[i];第\(i-1\)站到第\(i\)站的时......
  • 题解 CF1501B 【Napoleon Cake】
    postedon2021-03-1617:42:06|under题解|source题目可以转化一下:给一个长为\(n\)的数组\(a\),请求出一个长为\(n\)的数组\(b\)。要求若\(a_i\)不为\(0\),则\([b_{i-a_i+1},b_i]\)这个区间要为\(1\)。知道这个题目意思就好办了。题目说\(n\leq2\times10^5\),......
  • 题解 CF1497C2 【k-LCM (hard version)】
    postedon2021-03-2009:09:40|under题解|source2023编者注:有一些链接点不进去,分别是cf1497c1的cf页面和https://www.cnblogs.com/caijianhong/p/Solution-cf1497c1.html此题与CF1497C1有异曲同工之妙。我们知道,\(\operatorname{lcm}(1,x)=x\),不难想到,\(\operato......
  • 题解 CF1497C1 【k-LCM (easy version)】
    postedon2021-03-2008:26:53|under题解|source看数据范围,\(1\leqT\leq10^4\),\(1\leqn\leq10^9\),显然是构造题。我们分三类讨论:\(n\bmod2=1\):显然可以先提出一个\(1\),再把\(n-1\)分成两半,\(\operatorname{lcm}(1,\frac{n-1}{2},\frac{n-1}{2})=\frac{n-1}{2}\le......
  • 题解 P7679 【[COCI2008-2009#5] JABUKA】
    postedon2021-07-0717:38:14|under题解|source设题目中分给每个朋友的苹果数为\(x\),显然有\(x\vertr\landx\vertg\),也就是\(x\vert\gcd(r,g)\)。我们都知道,如果\(a\timesb=c\),那\(a\)和\(b\)都是\(c\)的因数,也就是说因数都是成对出现的(注意特判完全平方......
  • 题解 P2229 【[HNOI2002]沙漠寻宝】
    postedon2021-06-0112:15:15|under题解|source这题一看就知道是个模拟。做模拟题的时候,一定要先确保你的程序能跑出正确的结果,再去想优化时间。这道题还是很简单的,让我们开始吧:读入我们把输入离线,拿string存起来。如果不离线,那loop就会很难处理,加大难度。intn;......
  • 题解 P2903 【[USACO08MAR]The Loathesome Hay Baler S】
    postedon2021-05-0320:50:49|under题解|source首先输入,记录一下哪个齿轮的位置在\((0,0)\),哪个在\((x_t,y_t)\)。接着,为了避免多次判断两个齿轮相切而超时,我们可以预处理一个\(link_{i,j}\),表示第\(i\)个齿轮是否和第\(j\)个齿轮相切。这部分直接\(O(n^2)\)暴......
  • 题解 P1538 【迎春舞会之数字舞蹈】
    postedon2021-06-0113:24:05|under题解|source给\(0\cdots9\)每个数字打表,打它在相应的位置有没有一划。然后把每个数字分成\(5\)部分,暴力输出即可。#include<cstdio>#include<cstring>usingnamespacestd;constchar*db[]={"-||||-","||"......
  • 【大联盟】20230714 T1 三分网络(tri) 题解 CF1666K 【Kingdom Partition】
    题目描述here。题解赛时得分:\(30/30\),想了很久网络流最后不会。感觉这题就纯纯对脑洞,因为把题目中的\(2\)改成\(3\)就做不了)))不过还是相当有意思的。考虑如下建模方式:首先,考虑最小割。对于每个点\(i\),我们用两个点\(x_{i}\),\(y_i\)来表示。\(x_i\)表示\(i\)号点是......