紫书第五章习题 5-13 UVa822-Queue and A

编译原理第五章习题答案 龙书编译原理第五章习题的答案,基本是全的,免费下载 立即下载

出处:https://blog.youkuaiyun.com/pb1995/article/details/48736317

题目链接:https://vjudge.net/contest/231030#problem/M

又是一道简单的流程模拟题, 注意看题抠细节

关键在于安排任务时是以人为主体还是以待办的事件为循环主体

这要根据题目的某些要求来决定

这道题目要求有冲突时需要选出lasttime最早的, 否则就选出id最小的

乍一看感觉是要以待办事件为主体来找人的

但是写到一半发现写不下去了, 因为在找到一个available的人的时候, 还需要跟其他available的人作对比,

也就是说先要找出所有available的人, 再从这些人当中选出一个真正available的人来安排给他工作

但是这样就大大增加了题目的复杂度

解决这个问题的方案就是, 以人为循环主体来找工作( 其实题目里也有明确的暗示了, 只是之前没当一回事..)

按照题目的要求(两个要求, 自己定义一个比较函数)把存储人的数组先进行排序,

对排序后的人依次找一个topic做就 行了

结束的时机是所有人都不在工作并且所有工作都分配完了

    #include <iostream>  
    #include <cstdio>  
    #include <cstdlib>  
    #include <cstring>  
    #include <cmath>  
    #include <algorithm>  
    #include <string>  
    #include <vector>  
    #include <set>  
    #include <stack>  
    #include <queue>  
    #include <deque>  
    #include <map>  
    #include <list>  
    #include <cassert>  
    #include <iomanip>  
      
    using namespace std;  
    const int MAXN = 20+1;  
    typedef long long LL;  
      
    #define DEBUG2  
      
    /* 
    uva 12504 
     
     
    */  
    struct topic{  
        int id;  
        int num;  
        int beforeFirst;  
        int needed;  
        int between;  
        int last;  
    } topics[MAXN];  
      
    struct person{  
        int id;  
        int last;  
        int doing;  
        int cover;  
        int aval[MAXN];  
        bool isWorking;  
    } persons[MAXN];  
      
    bool operator<(const person & p1, const person & p2){  
        if( p1.last!=p2.last ) return p1.last<p2.last;  
        return p1.id<p2.id;  
    }  
      
    int T,N,Time;  
    int tq[MAXN];  
    bool isEnd;  
    map<int,int> mark;  
      
    int Getwork(int personNum){  
        int i = personNum;   
        for(int j=0; j<persons[i].cover; j++){  
            int n = persons[i].aval[j];   
            if( tq[n]>0 ){  
                return n;  
            }  
        }  
        return -1;  
    }  
      
    void update(){  
        for(int i=0; i<T; i++){  
            if( topics[i].num>0 ){  
                if( Time==topics[i].beforeFirst ){  
                    tq[i]++;  
                    topics[i].num--;  
                    topics[i].beforeFirst = -1;  
                    topics[i].last = Time;  
                }  
                if( Time-topics[i].last==topics[i].between && topics[i].beforeFirst==-1 ){  
                    tq[i]++;  
                    topics[i].num--;  
                    topics[i].last = Time;  
                }  
            }  
        }  
        sort(persons,persons+N);  
        for(int i=0; i<N; i++){  
            if( persons[i].isWorking ){  
                int doing = mark[persons[i].doing];  
                if( Time-persons[i].last==topics[doing].needed ){  
                    persons[i].isWorking = false;  
                    persons[i].doing = -1;  
                }  
            }  
        }  
        for(int j=0; j<T; j++){  
            for( int i=0; i<N; i++ ){  
                if( !persons[i].isWorking && j<persons[i].cover ){  
                    int n = mark[persons[i].aval[j]];   
                    if( tq[n]>0 ){  
                        tq[n]--;  
                        persons[i].doing = topics[n].id;  
                        persons[i].isWorking = true;  
                        persons[i].last = Time;  
                    }  
                }  
            }  
        }  
    }  
      
    void check(){  
        isEnd = true;  
        for(int i=0; i<N; i++){  
            if( persons[i].isWorking ) isEnd = false;  
        }  
        for(int i=0; i<T; i++){  
            if( topics[i].num>0 ) isEnd = false;  
        }   
    }  
      
    void initial(){  
        memset(tq,0,sizeof(tq));  
        memset(topics,0,sizeof(topics));  
        memset(persons,0,sizeof(persons));  
        mark.clear();  
        isEnd = false;  
        Time = 0;  
    }  
      
    void test(){  
        printf("Time = %d\n",Time);  
        printf("%-8s %-8s %-8s %-8s\n","id","isWorking","doing","last");  
        for(int i=0; i<N; i++){  
            printf("%-8d %-8d %-8d %-8d\n",persons[i].id, persons[i].isWorking, persons[i].doing, persons[i].last);  
        }  
        for(int i=0; i<T; i++){  
            printf("%d:%d\t",topics[i].id,tq[i]);  
        }  
        printf("\n----------------\n");  
        return ;  
    }  
      
    int main(){  
    //  freopen("input2.txt","r",stdin);  
        scanf("%d ",&T);  
        int Case = 0;  
        while( T!=0 ){  
            initial();  
            int n;  
            for(int i=0; i<T; i++){  
                cin >> topics[i].id >> topics[i].num >> topics[i].beforeFirst ;  
                cin >> topics[i].needed >> topics[i].between;  
                mark[topics[i].id] = i;  
            }  
            scanf("%d ",&N);  
            for(int i=0; i<N; i++){  
                cin >> persons[i].id >> persons[i].cover;  
                for(int j=0; j<persons[i].cover; j++){  
                    cin >> persons[i].aval[j];                    // 输入topic id   
                }  
                persons[i].last = persons[i].doing = -1;   
            }  
              
            while( !isEnd ){  
                update();  
                check();  
    //          test();  
                Time++;  
            }  
            printf("Scenario %d: All requests are serviced within %d minutes.\n",++Case,Time-1);  
            scanf("%d ",&T);  
        }  
        return 0;  
    }  


“龙书”第二版第5章习题答案——飞行射击小游戏(有bug) Introduction to 3D Game Programming with DirectX 9.0c —— A Shader Approach第5章习题的答案,只给了源码,使用方式参见ReadMe.txt文件。 这是一个飞行射击小游戏,不过有不少的bug,就是敌方post的识别有点问题,post导弹的射击有点问题,还有就是飞船打不坏地方的post。 立即下载

相关推荐

S32DS新建工程、编译调试下载、导入工程详细介绍

新建了一个工程之后,下面简单介绍下基本的UI界面。其中最左下角那个是界面,这个界面很重要,是图形化配置界面,然后可以根据这些配置自动生成代码。其中,左边那些配置文件,都是系统帮我们创建好了的,我们其实可以直接用就行。有PE工具的调试,以及Jlink工具的调试。我目前使用到PE工具调试可以查看寄存器值,而Jlink调试查看不了寄存器值。连接了开发板之后,点击Debug就可以吧程序下载到芯片上了,而且可以进入到调试界面。

luobeihai的博客 2万+

UVa822 - Queue and A(看着也写不利索的结构体)

#include #include #include using namespace std; struct topic{ int tid, num, t0, t, dt, q_num, finished; }; struct member{ int pid, k, work_left, last; vector pidk; bool operator < (con

Dosth_Magic 1083

高德地图与CAD图叠加显示方法汇总及优缺点分析

高德地图应用在许多领域,平常我们用的地图导航,除过正常的地图导航指引功能之外,其实还有很多实用的功能。如高德影像地图应用在包括地理、土地测量、水文学、生态学、气象学以及海洋学等方面。AutoCAD在行业中常用于城市规划、平面设计、建筑师等,这其中也要用到高德地图。最常见的是CAD图与高德地图叠加使用,通过两者叠加直观显示,助力行业提高工作效率。那如何将高德地图与CAD图叠加显示呢?下面听小编把方法一一介绍下以及各种方法的优缺点。

vjmap的博客 2722

UVA 822 Queue and A

题目链接:https://vjudge.net/problem/UVA-822 翻译摘自:《算法禁赛入门经典》 题目大意   你的任务是模拟一个客户中心运作情况。客服请求一共有n(1 ≤ n ≤ 20)种主题,每种主 题用 5 个整数描述:tid, num, t0, t, dt,其中 tid 为主题的唯一标识符,num为该主题的请求个 数,t0 为第一个请求的时刻,t 为处理一个请...

weixin_30287169的博客 286

Agentic AI上下文工程架构终极指南:全面解决智能体理解问题

在开始架构设计前,我们需要先明确两个核心概念——Agentic AI和上下文工程。Agentic AI(智能体AI)是具备自主目标、环境交互、任务分解能力的AI系统。自主性:不需要人类逐步指令,能自己规划任务(比如“帮我订机票”→自动分解为“查航班→选座位→填信息→支付”);动态性:能根据环境变化调整行为(比如订机票时发现航班延误,自动改签到下一班);连续性:能记住历史交互(比如“上次你说喜欢靠窗位,这次帮你预留了”)。

AI开发架构师 1116

SAP PP实战:MRP Area怎么用?手把手教你按产线、委外供应商拆分物料计划

本文详细解析了SAP PP模块中MRP Area的功能与应用,指导如何按产线、委外供应商拆分物料计划,实现精细化物料需求管理。通过实战案例展示MRP Area在减少计划冲突、提升库存准确率方面的显著效果,为制造业企业提供可落地的解决方案。

weixin_27015733的博客 432

822 - Queue and A (UVA)

里一句“以人为循环主体来找工作,按照题目的要求(两个要求, 自己定义一个比较函数)把存储人的数组先进行排序, 对排序后的人依次找一个topic做就行了”,点醒了我。人只需要排序一次即可,每次按这个顺序让客服挑工作。这又是一道很恶心的模拟题。(然后看到网上说“又是一道简单的流程模拟题”,差点昏过去……开始的代码超时,想不出好的解决办法。

linh2006的博客 252

2024年数字IC秋招-华为机试-数字芯片-实习笔试题

笔试题目:40个选择题A.综合时不同文件列表内的宏定义仅在本列表生效B.宏定义会覆盖,不需要单独undefC.仿真时出现宏定义冲突以最后一次值为准D.宏定义最好在各文件中随用随定义A.4/9B.4/6C.01D.0/6。

qq_42135020的博客 2892

UVA 822 Queue and A

感觉UVA越来越做不动了

wangjinhaowjh的博客 1304

MIPI CPHY学习笔记02:TX物理层一致性测试项解析(HS信令模式)第一部分

在手机、平板等移动设备中,MIPI C-PHY是连接相机、显示屏等高速外设的“数据高速公路”。高速(HS)信令模式就是这条公路的“快车道”,专门用于传输高清图像、视频等大容量数据,既要保证传输速率,又要维持信号稳定。物理层一致性测试是对这条“快车道”的全面质检,确保高速传输下数据不卡顿、不失真。今天我们聚焦MIPI C-PHY TX(发射端)的Group 2 HS信令测试,用通俗语言拆解22个核心测试项(含2个过时项),看懂高速信号的合格标准。

一只豌豆象的博客 288

机器人轨迹规划——梯形速度轨迹(超详细)

机器人轨迹 这一系列轨迹教程将主要包括以下内容: 点到点轨迹(P2P) 五次多项式插值轨迹 三次多项式插值轨迹 梯形速度曲线轨迹 双S形速度曲线轨迹 多个自由度轨迹的时间同步 在线轨迹规划 多项式在线轨迹规划 梯形在线轨迹规划 双S形在线轨迹规划 非线性实时轨迹滤波 多点轨迹(Multi-point) 三次样条曲线(cubic spline) 贝赛尔曲线(Bezier Curve) B样条曲线(BSpline) 时间最优轨迹 三次样条时间最优轨迹 任意路径下的时间最优轨迹 时间

出门搔白首,若负平生志 1万+

UVA-822 客户中心模拟 题解答案代码 算法竞赛入门经典第二版

GitHub - jzplp/aoapc-UVA-Answer: 算法竞赛入门经典 例题和习题答案 刘汝佳 第二版 AC代码 这个题目的做法可能并不唯一,对于某些场景有不同的答案也能过。 我的思路: 是任务选人,而不是人选任务,对于每个任务,首先选择对该任务有最高优先级的人(有多个则按照规则再选)。如果没有最高优先级的,就再选次高优先级的人。 但是如果同时有多个任务到达,应该首先选择哪个任务进行分配呢? 分配任务的不同顺序是会影响答案的结果的。我的答案中没考虑分配任务的问题就就AC了。因此对

Coding home - 漂流瓶jz 638

高云FPGA系列教程(7):ARM GPIO外部中断

高云GN1NSR-4C共有16个GPIO,每个GPIO可配置成输入或输出模式,支持中断输入,触发方式可选择:上升沿、下降沿、高电平、低电平触发。中断优先级可通过NVIC进行设置,支持 0-7 级可编程中断优先级。

whik1194的博客 1375

算法竞赛入门经典(第二版)-刘汝佳-第五章 C++与STL 习题(13/16)

说明本文是我对第五章16道习题的练习总结,建议配合紫书——《算法竞赛入门经典(第2版)》阅读本文。 另外为了方便做题,我在VOJ上开了一个contest,欢迎一起在上面做:第五章习题contest 如果想直接看某道题,请点开目录后点开相应的题目!!!习题习5-1 UVA 1593 代码对齐(vector)思路 此题的重点在于读入数据部分,读取每一行我用了getline,然后再用stringst

梁山伯的专栏 2744

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

UVA822 ac要点

首先题目里的每个人按优先级选工作的表达是不准确的,正确的说法是:让每个人都尽量选自己最熟悉的工作,并且如果一个人没找到自己最熟悉的工作的话,则要把挑选机会让给下一个人,而不是继续找自己下一个熟悉的工作. 举个例子 假定每个人的技能数都是5个,那么最坏情况下要经过5轮才能每个人都分配到工作, 也就是第一轮让每个人都尽量选自己最熟悉的工作,如果都找到了,则循环结束。否则没有找到工作的人进行第2轮...

laomai的专栏 532

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

UVA - 822 Queue and A

传送门:UVA-822 有点绕。。。 多个客服同时选中某个请求这里,可以先将客服按等待时间和id排序,然后就可以顺序处理了。 AC代码:   #include&lt;iostream&gt; #include&lt;vector&gt; #include&lt;queue&gt; #include&lt;cstring&gt; #include&lt;map&gt; #include&l...

weixin_42547447的博客 439

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

紫书UVa822

此题巨坑,慎入。 本人按紫书上所给思路实现,由于时间限制在一天内,分钟数小于1440,故每次分钟数増一也可保证算法所用时间不超时。此种方法无需优先队列。 1.已到达的请求移出topics,存储在waitingrequests当中。 2.对于每个客服,按序遍历其熟悉的工作,如果遇到其熟悉的工作在waitingrequests当中,则停止遍历,并将其放入chosen中,每个客服只选了一个请求。 3.若chosen.size()>0,置change=1。对于chosen中的每个工作,其可能对应有多个客服的.

weixin_46273288的博客 213

uva 822

原题 又是一道简单的流程模拟题, 注意看题抠细节 关键在于安排任务时是以人为主体还是以待办的事件为循环主体 这要根据题目的某些要求来决定 这道题目要求有冲突时需要选出lasttime最早的, 否则就选出id最小的 乍一看感觉是要以待办事件为主体来找人的 但是写到一半发现写不下去了, 因为在找到一个available的人的时候, 还需要跟其他available的人作对比, 也就是说

pb1995的博客 1097

UVA - 822 Queue and A

/* 法一借鉴自: http://blog.youkuaiyun.com/wangjinhaowjh/article/details/50551640 */ #include <iostream> #include <vector> #include <map> #include <algorithm> #define...

weixin_30344131的博客 206

[刷题]算法竞赛入门经典(第2版) 5-13/UVa822 - Queue and A

题意:模拟客服MM,一共有N种话题,每个客服MM支持处理其中的i个(i < N),处理的话题还有优先级。为了简化流程方便出题,设每个话题都是每隔m分钟来咨询一次。现知道每个话题前来咨询的时间、间隔、处理此话题所需的时长与一共有多少次咨询。问多少时间后全部话题处理完成。 代码:(Accepted,0.010s) //UVa822 - Queue and A //Ac...

weixin_30257433的博客 193

UVA 822 - Queue and A

过程稍微复杂,解析见注释 #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef struct{ string id_p;//工作人员编号 int lst_w_t;//上一份

zju2016的博客 441

UVA ~ 822 ~ Queue and A (STL + 模拟)

题意:你的任务是模拟一个客户中心运作情况。客服请求共有n (1&lt;=n&lt;=20) 种主题,每种主题用5个整数描述: tid,num,t0,tdt,其中tid 为主题的唯一标识符,num为该主题的请求个数,t0为第一个请求的时刻,为处理一个请求的时间,dt 为相邻两个请求之间的间隔(为了简单情况,假定同一个主题的请求按照相的间隔到达)。客户中心有m (1&lt;=m&lt;=5) 个客服,...

张松超的博客 1047

UVa 822 - Queue and A

昨天 #include #include #include using namespace std; struct topic{ int tid,num,t0,t,dt,q_num,finished; }; struct member{ int pid,k,work_left,last; vectorpidk; bool operator <(const memb

wcr1996的专栏 2763

822 - Queue and A

The customer support group of Contest.comreceives and responds to requests for technical support via e-mail. Requestsmay begin arriving when the office opens at 8:00 a.m. and all requests must beservi

gaoxiangnumber1——Gao Xiang's Blog 804

UVA5-13 容我休息一会再看822 - Queue and A

#include #include #include using namespace std; struct topic{ int tid,num,t0,t,dt,q_num,finished; }; struct member{ int pid,k,work_left,last;

DS00HY的小博客 819
上一篇: 紫书第五章习题 5-12 UVa511-Do You know The Way to san jose
下一篇: 紫书第五章习题 5-14 UVa1598-Exchange
JXUFE_ACMer
博客等级 码龄9年 20粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值