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