• 队列及其简单应用


    ##什么是队列 队列是一种先进先出,后进后出的线性表. 同栈相反,队列一头进,而另外一头出.我们同样可以通过画图来理解队列. ![队列结构图](https://img-blog.csdn.net/20180721072505655?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1JvbmFsZG83X1pZQg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

    如何去实现或模拟队列的操作

    我们可以用head和tail表示,head表示指向对头的指针,tail表示指向队尾的指针.
    我们设q为模拟队列的数组,那么对于5个元素q={2,5,7,4,6}中,head指向2其数值为1,tail指向6其数值为5.由此,我们可以得出结论:
    1.当队列元素只有一个,head=tail
    2.当队列元素有多个,head<tail
    3.当队列内存在元素,head≤tail
    4.当一个队列不存在时,head>tail
    如何实现进队与出队的操作?
    进队:我们假设进队元素为k,则只需要在尾部插入元素k即可

    tail++;
    q[tail]=k;
    

    出队:只需要将对头右移一个即可

    head++;
    

    作弊的发牌者

    题目描述

    贝茜正在与她的N-1(2 <= N <= 100)个朋友打牌。她们玩的牌一副为K(N <= K <= 100,000,K为N的倍数)张。所有牌中,一共有M(M = K / N)张“好
    牌”,其余的K - M张为“差牌”。
    贝茜是游戏的发牌者,很自然地,她想把所有好牌都留给自己。她热衷于获胜,即使为此必须采取一些不正当的手段。
    在若干局游戏后,贝茜的朋友们开始怀疑贝茜在游戏中作弊,于是她们想了个对策:使用新的发牌规则。规则具体如下:
    1.贝茜把牌堆的最上面一张发给她右边的奶牛
    1.每当贝茜发完一张牌,她都得将牌堆顶部接下来的P(1 <= P <= 10)张牌 放到底部去(一般把这个操作称为切牌)
    1.然后,贝茜对逆时针方向的下一头奶牛重复上述的操作
    贝茜绝望地认为,她再也不可能获胜了,于是她找到了你,希望你告诉她,将好牌放在初始牌堆的哪些位置,能够确保它们在发完牌后全集中到她手里。顺带说明一下,我们把牌堆顶的牌定义为1号牌,从上往下第二张定义为2号牌,依此类推。
    输入格式
    第1行: 3个用空格隔开的整数:N、K,以及P
    输出格式
    第1..M行: 每行输出一个正整数,表示贝茜应该在初始牌堆的这个位置放一张好牌。所有的位置按升序输出。
    input
    3 9 2
    output
    3
    7
    8

    显然,这道题目我们需要去模拟其发牌情况,因此需要用队列进行操作.
    根据其操作间隔,每一都进行以此将对头出队,将队尾入队的操作.每一次枚举到的队头即为好牌.
    代码如下:

    #include<bits/stdc++.h>
    using namespace std;
    int N,K,P;
    int tot[120]={},now;
    int Cards[120][120000]={};
    int q[10000000]={},H=1,T;
    int main()
    {
    	cin>>N>>K>>P;
    	for (int i=1;i<=K;i++)
    	    q[i]=i;
    	T=K;
    	now=2;
    	for (;H<=T;)
    	{
    		Cards[now][++tot[now]]=q[H++];
    		now=now%N+1;
    		for (int i=1;i<=P;i++)
    		{
    			q[++T]=q[H];
    			H++;
    		}
    	}
    	sort(Cards[1]+1,Cards[1]+tot[1]+1);
    	for (int i=1;i<=tot[1];i++)
    	    cout<<Cards[1][i]<<endl;
    	return 0;
    }
    

    机器翻译

    【问题描述】
    小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章。这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换。对于每个英文单词,软件会先在内存中查找这个单词的中文含义,如果内存中有,软件就会用它进行翻译;如果内存中没有,软件就会在外存中的词典内查找,查出单词的中文含义然后翻译,并将这个单词和译义放入内存,以备后续的查找和翻译。假设内存中有 M 个单元,每单元能存放一个单词和译义。每当软件将一个新单词存入内存前,如果当前内存中已存入的单词数不超过 M−1 ,软件会将新单词存入一个未使用的内存单元;若内存中已存入 M个单词,软件会清空最早进入内存的那个单词,腾出单元来,存放新单词。假设一篇英语文章的长度为 N 个单词。给定这篇待译文章,翻译软件需要去外存查找多少次词典?假设在翻译开始前,内存中没有任何单词。
    【样例 1】
    ex_translate1.in
    3 7
    1 2 1 5 4 4 1
    ex_translate1.out
    5
    这道题目,其实同样是用队列来模拟的整一个过程.
    即把每一次查询的单词存入队列:
    新存入的相当于入队操作,后存入的相当于出队操作
    代码如下:(emmmm比较难看,这是第一次书写队列的代码,请谅解)

    #include<bits/stdc++.h>
    using namespace std;
    int l=1,r=1,n,m,a[1000000],flag[1000000]={},q[10000000],ans=0;
    int main()
    {
    	cin>>m>>n;
    	for (int i=1;i<=n;i++)cin>>a[i];
    	for (int i=1;i<=n;i++)
    	{
    		if (!flag[a[i]])
    		{
    			if (r-l==m) flag[q[l++]]=0;
    			q[r++]=a[i];
    			flag[a[i]]=1;
    			ans++;
    		}
    	}
    	cout<<ans;
    }
    
  • 相关阅读:
    TortoiseSVN 命令 (命令行执行工具)(转)
    express blend下载
    js绝对地址图片转换成base64的方法
    js判断是否安装flash player及当前版本 和 检查flash版本是否需要升级
    js实现默认或者触发一个事件选中元素内容的方法
    js实现复制功能,将需要复制的内容放入剪切板上
    前端js上传文件插件
    javascript检测浏览器的缩放状态实现代码 是指浏览器网页内容的百分比缩放(按Ctrl和+号键或者-号键的缩放)
    html5 canvas 画图移动端出现锯齿毛边的解决方法
    jquery实现全选/反选功能
  • 原文地址:https://www.cnblogs.com/pigzhouyb/p/10119816.html
Copyright © 2020-2023  润新知