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 }

看起来就佩服!

Donghua University
原文地址:https://www.cnblogs.com/ohxiaobai/p/4055659.html