uva144 Student Grants

问题描述:每年学校通过自动发款机为每个学生发放40元的补助。补助的发放过程由两个部分构成:一个是自动发款机的工作过程,二是学生取款的过程。

  自动发款机的工作过程是:发款机分为后台部分和前台部分。后台部分存有大量的1元的硬币。工作开始时后台先向前台传送1枚硬币,当硬币被分发给学生后,后台再向前台同时传送2枚硬币,硬币同时被分发后,后台再向前台同时传送3枚.....这样直到后台向前台传送的金额数达到前台的极限值k后,后台向前台传送的硬币金额数会重新变成1,再又一直到k。如此反复。设k = 3,则后台向前台传送的硬币金额数依次为:1,2,3,1,2,3,...

  学生取款的过程是:学生将记录补助金额总数的磁卡插入前台,后台向前台传送硬币数。此时会出现三种情况:

第一:如果此时前台的硬币金额数加上学生磁卡中的金额数小于40,当前台支付给学生所有金额后,此学生取出磁卡,接着到队尾再去排队领补助。

第二:如果此时前台的硬币金额数加上学生磁卡中的金额数等于40,当前台支付给学生所有金额后,此学生离队。

第三:如果此时前台的硬币金额数加上学生磁卡中的金额数大于40,前台会首先支付给学生硬币金额,当学生磁卡中金额总数为40时,此学生离队,前台会将剩余的金额支付给下一位排队的学生。

先贴我的代码,然后是老师的代码,我是根据老师思路写的,比他差远了。

 1 #include <iostream>
 2 #include <queue>
 3 #include <iomanip>
 4 using namespace std;
 5 
 6 struct StuID{
 7     int IntPayNum;
 8     int CardNum;
 9 };
10 queue<StuID> queStu;
11 
12 void solve(int N,int k);
13 class Machine{
14 private:
15     int intOutput;
16     int intLimit;
17     int intNextcoins;
18 public:
19     Machine(int k);//构造函数
20     void process(StuID *card);
21 };
22 Machine::Machine(int k){
23     intOutput = 1;
24     intLimit = k;
25     intNextcoins = 1;
26 }
27 void Machine::process(StuID *card){
28     if(card->IntPayNum + intOutput <= 40){
29         card->IntPayNum += intOutput;
30         intNextcoins = 1 + (intNextcoins % intLimit);//此处注意,
31         intOutput = intNextcoins;
32     }
33     else{
34         intOutput = intOutput - (40 - card->IntPayNum);
35         card->IntPayNum = 40;
36     }
37 }
38 int main()
39 {
40     //freopen("D:\\t.txt","r",stdin);
41     int N,k;
42     while((cin>>N>>k)&&!(N==0&&k==0)){
43         solve(N,k);
44         cout<<endl;
45     }
46     return 0;
47 }
48 
49 
50 void solve(int N,int k){
51     StuID StuForm;
52     while(!queStu.empty()){queStu.pop();}
53     for(int i = 0;i < N;i++){
54         StuForm.CardNum = i + 1;
55         StuForm.IntPayNum = 0;
56         queStu.push(StuForm);
57     }//初始化学生队列;
58     StuID student;
59     Machine get(k);
60     while(!queStu.empty()){
61         student = queStu.front();
62         queStu.pop();
63         get.process(&student);
64         if (student.IntPayNum == 40){
65             cout << setw(3) << student.CardNum;
66         }
67         else{
68             queStu.push(student);
69         }
70     }
71 
72 }

第30行:此处要注意,此处是为了记忆当前台依次发放金额的多少,和学生取款时问题3相关。

下面是老师的代码:

 1 /*********************************/
 2 /* uva144 Student Grants
 3 /* Coded by Guojin ZHU
 4 /* Run Time 0.008s
 5 /* AC on July 12, 2010
 6 /*********************************/
 7 #include <iostream>
 8 #include <iomanip>
 9 #include <queue>
10 using namespace std;
11 ///////////////////////////////
12 struct IDCard{
13     int intIDNumber;
14     int intPayment;
15 };
16 class Machine{
17 private:
18     int intOutputStore;
19     int intLimit;
20     int intNextCoins;
21 public:
22     Machine(int k);
23     void makingPayment(IDCard* card);
24 };
25 Machine::Machine(int k){
26     intOutputStore = 1;
27     intLimit = k;
28     intNextCoins = 1;    
29 }
30 void Machine::makingPayment(IDCard* card){
31     if ((card->intPayment + intOutputStore) <= 40){
32         card->intPayment += intOutputStore;
33         intNextCoins = 1 + (intNextCoins % intLimit);
34         intOutputStore = intNextCoins;
35     }else{
36         intOutputStore -= 40 - card->intPayment;
37         card->intPayment = 40; 
38     }
39 }
40 ///////////////////////////////
41 class StudentGrants{
42 private:
43     int intNumberOfStudents;
44     int intLimitForMachine;
45     queue<IDCard> queCard;
46 public:
47     void setNumber(int n);
48     void setLimit(int k){intLimitForMachine = k;};
49     void process();
50 };
51 void StudentGrants::setNumber(int n){
52     IDCard card;
53     intNumberOfStudents = n;
54     while (!queCard.empty()){
55         queCard.pop();
56     }
57     for (int i = 0; i < intNumberOfStudents; i++){
58         card.intIDNumber = i + 1;
59         card.intPayment = 0;
60         queCard.push(card);
61     }
62 }
63 void StudentGrants::process(){
64     Machine m(intLimitForMachine);
65     IDCard card;
66     while (!queCard.empty()){
67         card = queCard.front();
68         queCard.pop();
69         m.makingPayment(&card);
70         if (card.intPayment == 40){
71             cout << setw(3) << card.intIDNumber;
72         }else{
73             queCard.push(card);
74         }
75     }
76     cout << endl;
77 }
78 ////////////////////////////////
79 int main(){
80     int n, k;
81     StudentGrants sg;
82     while((cin >> n >> k) && !((n == 0) && (k == 0))){
83         sg.setNumber(n);
84         sg.setLimit(k);
85         sg.process();
86     }
87     return 0;
88 }

看起来就佩服!

 
 
 
 
 
 
 

转载于:https://www.cnblogs.com/ohxiaobai/p/4055659.html

资源下载链接为: https://pan.quark.cn/s/67c535f75d4c 在机器人技术中,轨迹规划是实现机器人从一个位置平稳高效移动到另一个位置的核心环节。本资源提供了一套基于 MATLAB 的机器人轨迹规划程序,涵盖了关节空间和笛卡尔空间两种规划方式。MATLAB 是一种强大的数值计算与可视化工具,凭借其灵活易用的特点,常被用于机器人控制算法的开发与仿真。 关节空间轨迹规划主要关注机器人各关节角度的变化,生成从初始配置到目标配置的连续路径。其关键知识点包括: 关节变量:指机器人各关节的旋转角度或伸缩长度。 运动学逆解:通过数学方法从末端执行器的目标位置反推关节变量。 路径平滑:确保关节变量轨迹连续且无抖动,常用方法有 S 型曲线拟合、多项式插值等。 速度和加速度限制:考虑关节的实际物理限制,确保轨迹在允许的动态范围内。 碰撞避免:在规划过程中避免关节与其他物体发生碰撞。 笛卡尔空间轨迹规划直接处理机器人末端执行器在工作空间中的位置和姿态变化,涉及以下内容: 工作空间:机器人可到达的所有三维空间点的集合。 路径规划:在工作空间中找到一条从起点到终点的无碰撞路径。 障碍物表示:采用二维或三维网格、Voronoi 图、Octree 等数据结构表示工作空间中的障碍物。 轨迹生成:通过样条曲线、直线插值等方法生成平滑路径。 实时更新:在规划过程中实时检测并避开新出现的障碍物。 在 MATLAB 中实现上述规划方法,可以借助其内置函数和工具箱: 优化工具箱:用于解决运动学逆解和路径规划中的优化问题。 Simulink:可视化建模环境,适合构建和仿真复杂的控制系统。 ODE 求解器:如 ode45,用于求解机器人动力学方程和轨迹执行过程中的运动学问题。 在实际应用中,通常会结合关节空间和笛卡尔空间的规划方法。先在关节空间生成平滑轨迹,再通过运动学正解将关节轨迹转换为笛卡
07-17
<think>嗯,用户这次聚焦在无线通信上行链路资源分配的Grant机制上,看来是对之前PUSCH资源分配讨论的深化。用户特意引用了站内资料,其中引用[1]提到免动态调度的PUR机制和两类Grant的区别,引用[2]强调调度原理和资源分配限制因素,这些都需要重点回应。 用户可能正在研究5G上行调度机制,或是遇到实际网络优化问题。从ta引用文献的深度看,至少具备中级无线通信知识,但需要更系统的机制梳理。尤其ta提到"Grant机制"这个核心概念,需要区分Type1和Type2的本质差异——这正是调度优化的关键突破口。 上次回答已详细拆解过PUSCH资源分配流程,这次要更突出"授权"的动态特性。特别要注意三点:一是引用[1]中PUR预配置与动态授权的对比案例,二是引用[3]中MAC层调度器的核心作用,三是引用[4]的MCS联动机制。这些正好构成Grant机制的完整逻辑链:时频资源分配→调制编码→传输控制。 技术细节上需要强调创新点:比如Type2授权中的DCI格式0_1包含的RV参数重传策略,这是多数文档容易忽略的实战要点。计算示例保留上次的TBS公式但改用Grant触发场景更契合主题,同时补充30kHz子载波间隔的时域调度案例——毕竟用户引用[2]提到"上行单用户RB数分配限制"。 最后生成的问题要延续用户引用的方向:引用[1]涉及免调度,自然延伸URLLC低时延方案;引用[3]提到HARQ失败,正好探讨可靠性增强机制。这样既能闭环当前问题,又打开新维度。</think>在无线通信系统中,上行链路资源分配的Grant机制是基站(gNB)动态控制用户设备(UE)数据传输的核心调度策略。其核心流程与技术要点如下: --- ### **一、Grant机制基本原理** #### 1. **调度控制闭环** - **基站主导**:基站基于信道质量指示(CQI)、缓存状态报告(BSR)和调度请求(SR)动态分配资源[^2] - **两级授权**: - **Type 1(静态授权)**:通过RRC信令预配置资源(如PUR场景),适用于周期性业务[^1] - **Type 2(动态授权)**:通过PDCCH发送DCI(Format 0_0/0_1)实时分配资源,适用于突发业务[^4] #### 2. **关键参数分配** 基站通过DCI下发: - **频域资源**:RIV(Resource Indication Value)标识RB起始位置和连续RB数量 $$ \text{RIV} = N_{\text{RB}}^{\text{UL}} \times (L_{\text{RB}} -1) + RB_{\text{start}} \quad (L_{\text{RB}} \leq \lfloor N_{\text{RB}}^{\text{UL}}/2 \rfloor) $$ - **调制编码**:MCS索引(4-5bit)指示调制阶数$Q_m$和码率$R$(查3GPP TS 38.214表)[^4] - **时域资源**:K2值定义PDCCH到PUSCH的时隙偏移(5G NR支持$\mu$=0~4多种 Numerology) --- ### **二、动态调度流程** ```mermaid graph TD A[UE发送SR] --> B{基站检测资源需求} B -->|有数据待传| C[基站计算调度策略] C --> D[生成DCI Format 0_1] D --> E[通过PDCCH下发Grant] E --> F[UE解析DCI获取资源参数] F --> G[在指定RB发送PUSCH] ``` #### 关键技术环节: 1. **SR触发**(1~2bit SR在PUCCH发送) 2. **DCI内容**: - 频域资源分配(RIV或比特图) - MCS索引(决定TBS) - HARQ进程号 - 新数据指示(NDI) - RV(冗余版本)[^3] 3. **时延约束**:K2 ≥ 处理时延 + 时序提前量(TA),典型值1~4时隙 --- ### **三、免调度传输(Grant-Free)** 适用于URLLC和小包业务,通过预配置资源降低时延[^1]: ```mermaid graph LR H[RRC预配置Type1 Grant] --> I[固定周期PUR资源] I --> J[UE直接发送数据] J --> K{基站是否解码成功} K -->|是| L[无需反馈] K -->|否| M[触发重传Grant] ``` - **优势**:省去SR/DCI交互,时延降低30%~50% - **限制**:需精确TA同步,资源利用率较低 --- ### **四、性能优化关键** 1. **信道敏感调度**: - 基于SRS测量实现频选调度 - 边缘用户分配更多RB 2. **MCS自适应**: $$ \text{目标BLER} = \begin{cases} 10^{-1} & \text{初始传输} \\ 10^{-5} & \text{HARQ重传} \end{cases} $$ 3. **HARQ增强**: - 异步自适应重传 - RV序列优化(如[0,2,3,1]) --- ### **五、典型问题分析** **案例:上行吞吐率低** - **根因1**:RB分配不足 → 检查UL Grant次数和RBG分配策略[^2] - **根因2**:MCS等级低 → 分析SINR和IBLER - **根因3**:HARQ失败率高 → 优化功率控制或调整RV序列[^3] > 📌 **计算示例**:100MHz带宽(273RB),256QAM($Q_m=8$),码率$R=0.9$,4流MIMO > $$ TBS = 273 \times 12 \times 12 \times 0.9 \times 8 \times 4 \times (1-0.14) \approx 1.15 \text{ Mb/时隙} $$ > 理论速率:$\frac{1.15 \text{ Mb}}{1 \text{ ms}} = 1.15 \text{ Gbps}$(实际约800Mbps[^2]) --- **
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值