看到这个题一共也就pow(3,10)=59049次循环,那不就暴力了嘛!

虽然说正解是动归和搜索

但是搜索和暴力枚举的差距真心不大(不好好学习qwq)。

看到楼上又说到

答案需要数据存储的问题,

这里提供一种借助STL的queue(队列)来进行存储的方法。

这个方法难度几乎为0,每个新手都可以学习!


原理:队列的先入先出原则

操作:

队列名.push(变量名)

将变量压入队列

队列名.front()

返回队列头部元素

队列名.pop()

弹出队列头部元素

以下是例子:

假设Farmer John想让你对输入的数据进行分类(ABCD类)存储,

并且把指定的类型(A型)的数据全部按照输入的顺序输出来

给一个数据总数,再一个个把数据给你。(假设同一类型的数据最多8个)

  1. 输入样例: 输出样例:
  2. 6 21 -12 102
  3. A 21
  4. A -12
  5. A 102
  6. B 134011
  7. D 2147483647
  8. C 2147483647

于是样例程序就是:

  1. #include <queue>
  2. //以上是队列必须要加上的头文件
  3. #include <cstdio>
  4. using namespace std;
  5. queue<int>qwq[4];
  6. //<你要使用的类型>随便一个合法的名字
  7. //队列是数据类型,可以作为数组使用!
  8. int main()
  9. {
  10. int n,input;
  11. char ch;
  12. cin>>n;
  13. for (int i=1;i<=n;i++)
  14. cin>>ch>>input;
  15. qwq[ch-'A'].push(input);
  16. //操作:将数据压入队列
  17. while (!qwq[0].empty())
  18. cout<<qwq.front();qwq.pop();
  19. //操作:输出队列最先输入的第一个元素,然后弹出它
  20. //直到qwq[0]内没有元素
  21. return 0;
  22. }

用队列的好处就是如果没有元素输入,那就没有输出,不浪费内存。

这种情况(巨毒瘤)在我学校老师出的题里面有...

Python 3的列表也可以用类似这个方法的方法来存储数据,但是方便许多。

假的,因为弹出头部元素其他都得跟着一块动,伤不起。


回归正题。

既然要减少循环次数,那么就可以使用它。

但仍有最坏的情况(n=20)出现。

那么最坏情况需要输出多少次呢?

答案:8953

太好了!尽情使用吧!管他呢!这种情况之下队列优化也没有办法!

(Mode:c++)Code:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <queue>
  4. using namespace std;
  5. struct peiliao{//自定义类型peiliao作为队列的元素
  6. int a,b,c,d,e,f,g,h,i,j;
  7. };
  8. queue<peiliao>qwq;//存储容器在这里!!!!!!!
  9. int main()
  10. {
  11. int a,b,c,d,e,f,g,h,i,j,n;
  12. peiliao kaoji;//暂时性质的变量peiliao元素
  13. scanf("%d",&n);
  14. if (n<10||n>30)
  15. {//如果小于10或者是大于30,肯定做不出要求的烤鸡
  16. putchar('0');return 0;
  17. }
  18. for (a=1;a<=3;a++)
  19. for (b=1;b<=3;b++)
  20. for (c=1;c<=3;c++)
  21. for (d=1;d<=3;d++)
  22. for (e=1;e<=3;e++)
  23. for (f=1;f<=3;f++)
  24. for (g=1;g<=3;g++)
  25. for (h=1;h<=3;h++)
  26. for (i=1;i<=3;i++)
  27. for (j=1;j<=3;j++)
  28. if (a+b+c+d+e+f+g+h+i+j==n)
  29. {
  30. kaoji.a=a,kaoji.b=b,kaoji.c=c,kaoji.d=d,kaoji.e=e;
  31. kaoji.f=f,kaoji.g=g,kaoji.h=h,kaoji.i=i,kaoji.j=j;
  32. qwq.push(kaoji);//压入在这里!!!!!!!
  33. }
  34. if (qwq.empty())
  35. {
  36. putchar('0');
  37. }
  38. else
  39. {
  40. printf("%d\n",qwq.size());
  41. while (!qwq.empty())
  42. {输出在这里!!!!!!!!
  43. kaoji=qwq.front();
  44. qwq.pop();
  45. cout<<kaoji.a<<' '<<kaoji.b<<' '<<kaoji.c;
  46. cout<<' '<<kaoji.d<<' '<<kaoji.e<<' '<<kaoji.f;
  47. cout<<' '<<kaoji.g<<' '<<kaoji.h<<' '<<kaoji.i;
  48. cout<<' '<<kaoji.j<<endl;
  49. }
  50. }
  51. return 0;
  52. }

(Mode:Python 3)Code:

(原先的代码还是放在这里,后面有升级版)

因为从列表头部弹出元素十分耗时,所以放弃它。

弹出这些元素要花的次数在最坏的情况下最少是8953的阶乘。WTF?!

所以放弃吧,这样会TLE!但是我们的数据范围不足以让我们MLE。

经测试,另一种存储诞生了。现在下面不止是两层循环的暴力代码!

  1. #AC代码1
  2. n=int(input())
  3. count=0
  4. L=[1,2,3]
  5. for a in L:
  6. for b in L:
  7. for c in L:
  8. for d in L:
  9. for e in L:
  10. for f in L:
  11. for g in L:
  12. for h in L:
  13. for i in L:
  14. for j in L:
  15. if a+b+c+d+e+f+g+h+i+j is n:
  16. count=count+1
  17. if count<1:
  18. print("0")
  19. else:
  20. print(count)
  21. for a in L:
  22. for b in L:
  23. for c in L:
  24. for d in L:
  25. for e in L:
  26. for f in L:
  27. for g in L:
  28. for h in L:
  29. for i in L:
  30. for j in L:
  31. if a+b+c+d+e+f+g+h+i+j is n:
  32. print(a,b,c,d,e,f,g,h,i,j)

因为不足以MLE,所以用list存储还算可以的,并且代码压缩至21行。

至少不用再次10层循环了耶!

  1. #AC代码2
  2. n=int(input())
  3. L=[1,2,3]#省代码用的
  4. L2=list([])
  5. #用来当队列,但是不弹出元素的列表
  6. for a in L:
  7. for b in L:
  8. for c in L:
  9. for d in L:
  10. for e in L:
  11. for f in L:
  12. for g in L:
  13. for h in L:
  14. for i in L:
  15. for j in L:
  16. if a+b+c+d+e+f+g+h+i+j is n:
  17. L2.append([a,b,c,d,e,f,g,h,i,j])
  18. #压入列表
  19. print(len(L2))#列表长度即统计的个数
  20. for x in range(len(L2)):
  21. #逐个输出
  22. print(L2[x][0],L2[x][1],L2[x][2],L2[x][3],L2[x][4],L2[x][5],L2[x][6],L2[x][7],L2[x][8],L2[x][9])

重新探索,小金羊测试,AC! 果然比原先省下不少时间。


尾声。

望大家多多使用队列这个容器做一些类似的需要存储数据的问题。

类似的问题:营养膳食(优先队列可解)

不足求指正!小金羊(是个蒟蒻)尽力学习!

(本题解已更新!界面优化+新代码优化)

题解 P2089 【烤鸡】的更多相关文章

  1. 洛谷P2089烤鸡

    题目链接:https://www.luogu.org/problemnew/show/P2089 题目详情: 题目背景 猪猪hanke得到了一只鸡 题目描述 猪猪Hanke特别喜欢吃烤鸡(本是同畜牲, ...

  2. 洛谷 P2089 烤鸡【DFS递归/10重枚举】

    [链接]:https://www.luogu.org/problemnew/show/P2089 题目描述 猪猪Hanke特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke吃鸡很特别,为什么特别呢? ...

  3. P2089 烤鸡

    题目背景 猪猪hanke得到了一只鸡 题目描述 猪猪Hanke特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke吃鸡很特别,为什么特别呢?因为他有10种配料(芥末.孜然等),每种配料可以放1—3克, ...

  4. 洛谷P2089 烤鸡

    标签:暴力,枚举 题目背景 猪猪 Hanke 得到了一只鸡. 题目描述 猪猪 Hanke 特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke 吃鸡很特别,为什么特别呢?因为他有 10 种配料(芥末. ...

  5. (水题)洛谷 - P2089 - 烤鸡

    https://www.luogu.org/problemnew/show/P2089 非常暴力的dfs,不知道不剪枝会怎么样,但是其实最多也就 $3^{10}$ ,大不到哪里去.还有一个细节就是大于 ...

  6. (综合)P2089 烤鸡

    题解: 错误的: #include<stdio.h>int n,ret=0,a[10000][10];int p(int c,int s){ int i; for(i=1;i<=3; ...

  7. P2089 烤鸡(搜索简单题)

    题意:就是x分别是1到3的未知数,求x1+x2+x3.....+x10=n的方案数和输出每种方案.每种方案还必须按字典序输出 思路:就是简单的构建搜索树+约束条件啊,其实数据范围一点都不大,所以,我第 ...

  8. 洛谷 P2089 烤鸡

    看了前面大佬的代码,发现这道题的解题思路都大同小异. 首先肯定要定义一个变量累加方案数量,因为方案数量要最先输出,所以所有方案要先储存下来.个人不喜欢太多数组,就只定义一个字符串. 然后我们发现只有1 ...

  9. Java实现 洛谷 P2089 烤鸡

    import java.util.Arrays; import java.util.Iterator; import java.util.LinkedList; import java.util.Sc ...

随机推荐

  1. 成都Uber优步司机奖励政策(4月16日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  2. 【LG4317】花神的数论题

    [LG4317]花神的数论题 题面 洛谷 题解 设\(f_{i,up,tmp,d}\)表示当前在第\(i\)位,是否卡上界,有\(tmp\)个一,目标是几个一的方案数 最后将所有\(d\)固定,套数位 ...

  3. java模拟http请求

    java模拟http发送请求,第一种是HttpURLConnection发送post请求,第二种是使用httpclient模拟post请求, 方法一: package main.utils; impo ...

  4. css控制字体线使用:text-decoration

    css控制字体下划线使用text-decoration : text-decoration:none 无装饰,通常对html下划线标签去掉下划线样式 text-decoration:underline ...

  5. selenium webdriver API详解(三)

    本系列主要讲解webdriver常用的API使用方法(注意:使用前请确认环境是否安装成功,浏览器驱动是否与谷歌浏览器版本对应) 一:获取页面元素的文本内容:text 例:获取我的博客名字文本内容 代码 ...

  6. 136.只出现一次的数字 leetcode ^运算符 JavaScript解法

    leetcode上的一道题简单题 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间 ...

  7. 【RL系列】马尔可夫决策过程——Gambler's Problem

    Gambler's Problem,即“赌徒问题”,是一个经典的动态编程里值迭代应用的问题. 在一个掷硬币游戏中,赌徒先下注,如果硬币为正面,赌徒赢回双倍,若是反面,则输掉赌注.赌徒给自己定了一个目标 ...

  8. centos上搭建git服务--4

    Git是目前世界上最先进的分布式版本控制系统(没有之一).使用Svn的请参考<版本控制-svn服务器搭建和常用命令(centos 6.3)>,下面介绍Git的常用命令 常用命令 简单版 升 ...

  9. Hybrid APP基础篇(三)->Hybrid APP之Native和H5页面交互原理

    本文已经不维护,新地址: http://www.cnblogs.com/dailc/p/8097598.html 说明 Hybrid模式原生和H5交互原理 目录 前言 参考来源 前置技术要求 楔子 A ...

  10. Scrum立会报告+燃尽图(06)选题

    此作业要求参见:[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2195] 一.小组介绍 组长:王一可 组员:范靖旋,王硕,赵佳璐,范洪达 ...