题解 P2089 【烤鸡】
看到这个题一共也就pow(3,10)=59049次循环,那不就暴力了嘛!
虽然说正解是动归和搜索,
但是搜索和暴力枚举的差距真心不大(不好好学习qwq)。
看到楼上又说到
答案需要数据存储的问题,
这里提供一种借助STL的queue(队列)来进行存储的方法。
这个方法难度几乎为0,每个新手都可以学习!
原理:队列的先入先出原则
操作:
队列名.push(变量名)
将变量压入队列
队列名.front()
返回队列头部元素
队列名.pop()
弹出队列头部元素
以下是例子:
假设Farmer John想让你对输入的数据进行分类(ABCD类)存储,
并且把指定的类型(A型)的数据全部按照输入的顺序输出来。
给一个数据总数,再一个个把数据给你。(假设同一类型的数据最多8个)
输入样例: 输出样例:
6 21 -12 102
A 21
A -12
A 102
B 134011
D 2147483647
C 2147483647
于是样例程序就是:
#include <queue>
//以上是队列必须要加上的头文件
#include <cstdio>
using namespace std;
queue<int>qwq[4];
//<你要使用的类型>随便一个合法的名字
//队列是数据类型,可以作为数组使用!
int main()
{
int n,input;
char ch;
cin>>n;
for (int i=1;i<=n;i++)
cin>>ch>>input;
qwq[ch-'A'].push(input);
//操作:将数据压入队列
while (!qwq[0].empty())
cout<<qwq.front();qwq.pop();
//操作:输出队列最先输入的第一个元素,然后弹出它
//直到qwq[0]内没有元素
return 0;
}
用队列的好处就是如果没有元素输入,那就没有输出,不浪费内存。
这种情况(巨毒瘤)在我学校老师出的题里面有...
Python 3的列表也可以用类似这个方法的方法来存储数据,但是方便许多。
假的,因为弹出头部元素其他都得跟着一块动,伤不起。
回归正题。
既然要减少循环次数,那么就可以使用它。
但仍有最坏的情况(n=20)出现。
那么最坏情况需要输出多少次呢?
答案:8953
太好了!尽情使用吧!管他呢!这种情况之下队列优化也没有办法!
(Mode:c++)Code:
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
struct peiliao{//自定义类型peiliao作为队列的元素
int a,b,c,d,e,f,g,h,i,j;
};
queue<peiliao>qwq;//存储容器在这里!!!!!!!
int main()
{
int a,b,c,d,e,f,g,h,i,j,n;
peiliao kaoji;//暂时性质的变量peiliao元素
scanf("%d",&n);
if (n<10||n>30)
{//如果小于10或者是大于30,肯定做不出要求的烤鸡
putchar('0');return 0;
}
for (a=1;a<=3;a++)
for (b=1;b<=3;b++)
for (c=1;c<=3;c++)
for (d=1;d<=3;d++)
for (e=1;e<=3;e++)
for (f=1;f<=3;f++)
for (g=1;g<=3;g++)
for (h=1;h<=3;h++)
for (i=1;i<=3;i++)
for (j=1;j<=3;j++)
if (a+b+c+d+e+f+g+h+i+j==n)
{
kaoji.a=a,kaoji.b=b,kaoji.c=c,kaoji.d=d,kaoji.e=e;
kaoji.f=f,kaoji.g=g,kaoji.h=h,kaoji.i=i,kaoji.j=j;
qwq.push(kaoji);//压入在这里!!!!!!!
}
if (qwq.empty())
{
putchar('0');
}
else
{
printf("%d\n",qwq.size());
while (!qwq.empty())
{输出在这里!!!!!!!!
kaoji=qwq.front();
qwq.pop();
cout<<kaoji.a<<' '<<kaoji.b<<' '<<kaoji.c;
cout<<' '<<kaoji.d<<' '<<kaoji.e<<' '<<kaoji.f;
cout<<' '<<kaoji.g<<' '<<kaoji.h<<' '<<kaoji.i;
cout<<' '<<kaoji.j<<endl;
}
}
return 0;
}
(Mode:Python 3)Code:
(原先的代码还是放在这里,后面有升级版)
因为从列表头部弹出元素十分耗时,所以放弃它。
弹出这些元素要花的次数在最坏的情况下最少是8953的阶乘。WTF?!
所以放弃吧,这样会TLE!但是我们的数据范围不足以让我们MLE。
经测试,另一种存储诞生了。现在下面不止是两层循环的暴力代码!
#AC代码1
n=int(input())
count=0
L=[1,2,3]
for a in L:
for b in L:
for c in L:
for d in L:
for e in L:
for f in L:
for g in L:
for h in L:
for i in L:
for j in L:
if a+b+c+d+e+f+g+h+i+j is n:
count=count+1
if count<1:
print("0")
else:
print(count)
for a in L:
for b in L:
for c in L:
for d in L:
for e in L:
for f in L:
for g in L:
for h in L:
for i in L:
for j in L:
if a+b+c+d+e+f+g+h+i+j is n:
print(a,b,c,d,e,f,g,h,i,j)
因为不足以MLE,所以用list存储还算可以的,并且代码压缩至21行。
至少不用再次10层循环了耶!
#AC代码2
n=int(input())
L=[1,2,3]#省代码用的
L2=list([])
#用来当队列,但是不弹出元素的列表
for a in L:
for b in L:
for c in L:
for d in L:
for e in L:
for f in L:
for g in L:
for h in L:
for i in L:
for j in L:
if a+b+c+d+e+f+g+h+i+j is n:
L2.append([a,b,c,d,e,f,g,h,i,j])
#压入列表
print(len(L2))#列表长度即统计的个数
for x in range(len(L2)):
#逐个输出
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 【烤鸡】的更多相关文章
- 洛谷P2089烤鸡
题目链接:https://www.luogu.org/problemnew/show/P2089 题目详情: 题目背景 猪猪hanke得到了一只鸡 题目描述 猪猪Hanke特别喜欢吃烤鸡(本是同畜牲, ...
- 洛谷 P2089 烤鸡【DFS递归/10重枚举】
[链接]:https://www.luogu.org/problemnew/show/P2089 题目描述 猪猪Hanke特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke吃鸡很特别,为什么特别呢? ...
- P2089 烤鸡
题目背景 猪猪hanke得到了一只鸡 题目描述 猪猪Hanke特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke吃鸡很特别,为什么特别呢?因为他有10种配料(芥末.孜然等),每种配料可以放1—3克, ...
- 洛谷P2089 烤鸡
标签:暴力,枚举 题目背景 猪猪 Hanke 得到了一只鸡. 题目描述 猪猪 Hanke 特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke 吃鸡很特别,为什么特别呢?因为他有 10 种配料(芥末. ...
- (水题)洛谷 - P2089 - 烤鸡
https://www.luogu.org/problemnew/show/P2089 非常暴力的dfs,不知道不剪枝会怎么样,但是其实最多也就 $3^{10}$ ,大不到哪里去.还有一个细节就是大于 ...
- (综合)P2089 烤鸡
题解: 错误的: #include<stdio.h>int n,ret=0,a[10000][10];int p(int c,int s){ int i; for(i=1;i<=3; ...
- P2089 烤鸡(搜索简单题)
题意:就是x分别是1到3的未知数,求x1+x2+x3.....+x10=n的方案数和输出每种方案.每种方案还必须按字典序输出 思路:就是简单的构建搜索树+约束条件啊,其实数据范围一点都不大,所以,我第 ...
- 洛谷 P2089 烤鸡
看了前面大佬的代码,发现这道题的解题思路都大同小异. 首先肯定要定义一个变量累加方案数量,因为方案数量要最先输出,所以所有方案要先储存下来.个人不喜欢太多数组,就只定义一个字符串. 然后我们发现只有1 ...
- Java实现 洛谷 P2089 烤鸡
import java.util.Arrays; import java.util.Iterator; import java.util.LinkedList; import java.util.Sc ...
随机推荐
- RHCSA-EXAM 模拟题目
参考答案:http://www.cnblogs.com/venicid/category/1088924.html 请首先按找以下要求配置考试系统: * Hostname: server0.examp ...
- day 7 __new___
1 __new__方法 创建对象 实质是:调用父类的__new__方法创建的对象 class Dog(object): def __init__(self): print("---init方 ...
- 【LG3244】[HNOI2015]落忆枫音
题面 洛谷 题解 20pts 枚举每一条边是否在树中即可. 另10pts 我们考虑一张\(DAG\)中构成树的方法数,每个点选一个父亲即可,那么有 \[Ans=\prod_{i=1}^{n} deg_ ...
- mybatis逆向工程 mbg运行java代码时提示找不到MBG.xml的解决方法
这里要写全路径才能找到文件
- hive 空值、NULL判断
hive中空值判断基本分两种 (1)NULL 与 \N hive在底层数据中如何保存和标识NULL,是由 alter table name SET SERDEPROPERTIES('serializa ...
- bilibili携手WeTest,保障视频类应用优质适配体验
WeTest 导读 中国移动视频用户规模越来越大,各类移动视频APP也百家争鸣, B站作为国内知名的年轻人文化社区,bilibili在推出移动端时,除了坚持自身的独特定位以外,对其APP的质量也十分重 ...
- javaweb(七)——HttpServletResponse对象(一)
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象.request和response对象即然代表请求和响应,那我们要 ...
- Wince 中访问WCF服务
由于本文并非WinCE开发普及篇,所以一些WinCE开发和WCF开发的基础还请移步百度和谷歌寻找答案,然后结合本文开发出WinCE中如何访问WCF,谢谢. 开发环境 IDE:Visual Studio ...
- 八、EnterpriseFrameWork框架基础功能之自定义报表
本章写关于框架中的“自定义报表”,类似上章“字典管理”也是三部分功能组成,包括配置报表.对报表按角色授权.查看报表:其核心思想就是实现新增一个报表而不用修改程序代码.不用升级,只需要编写一个存储过程, ...
- jmeter接口测试实例:带参数、带token
测试内容简介: 1.get请求,无参数 2.get请求,参数为第一条响应中的id 3.get请求,带token 结构图: 下面进行详解: 一.添加cookie管理器等 1.添加ht ...