首页 > 代码库 > uva144 Student Grants

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 }

看起来就佩服!

 
 
 
 
 
 
 

uva144 Student Grants