[关闭]
@yuyuesheng 2019-01-25T17:09:32.000000Z 字数 1715 阅读 771

D - queue的使用

题意:有两种操作,ENQUEUE操作是将某元素插入团队中,将元素插入团队的情况有两种,若团队中已有该元素所属小组的元素,则插在与它相同小组元素的后面,若团队中没有该元素所属小组的元素,则将此元素插入团队的尾端。DEQUEUE是取出团队的元素。
题解:用两个队列,一个队列存团队中小组的顺序,一个队列存小组元素在团队出现的顺序。

  1. #include<iostream>
  2. #include<queue>
  3. #include<map>
  4. using namespace std;
  5. char cmd[10];
  6. int main(){
  7. int t,cnt,ele,num,id,cas=0;
  8. while(1){
  9. cin>>t;
  10. if(t==0)
  11. break;
  12. cout<<"Scenario #"<<++cas<<endl;
  13. map<int,int>m;
  14. queue<int>team,q[1500];
  15. for(int i = 0 ; i < t ; i++){
  16. cin>>cnt;
  17. for(int j = 0 ; j < cnt ; j++){
  18. cin>>ele;
  19. m[ele]=i;
  20. }
  21. }
  22. while(1){
  23. cin>>cmd;
  24. if(cmd[0]=='S')
  25. break;
  26. else if(cmd[0]=='E'){
  27. cin>>num;
  28. id = m[num];
  29. if(q[id].empty())
  30. team.push(id);
  31. q[id].push(num);
  32. }
  33. else{
  34. id = team.front();
  35. cout<<q[id].front()<<endl;
  36. q[id].pop();
  37. if(q[id].empty())
  38. team.pop();
  39. }
  40. }
  41. cout<<endl;
  42. }
  43. }

E - 优先队列的使用

题意:定义素数因数只含2,3,5的数为丑数,求出第1500个丑数。
题解:如果x是丑数,那么2x,3x,4x,5x也一定为丑数,所以不断的抽取最小的丑数打表直至第1500个元素。标记已统计的元素,避免重复计数.会爆int

  1. #include<iostream>
  2. #include<map>
  3. #include<queue>
  4. using namespace std;
  5. typedef long long ll;
  6. priority_queue<ll,vector<ll>, greater<ll> > q;
  7. map<ll,int>m;
  8. int main(){
  9. int cnt = 0;
  10. q.push(1);
  11. while(1){
  12. ll num = q.top();
  13. q.pop();
  14. cnt++;
  15. if(cnt == 1500){
  16. cout<<"The 1500'th ugly number is "<<num<<"."<<endl;
  17. break;
  18. }
  19. if(m[num*2]==0){
  20. q.push(num*2);
  21. m[num*2]=1;
  22. }
  23. if(m[num*3]==0){
  24. q.push(num*3);
  25. m[num*3]=1;
  26. }
  27. if(m[num*4]==0){
  28. q.push(num*4);
  29. m[num*4]=1;
  30. }
  31. if(m[num*5]==0){
  32. q.push(num*5);
  33. m[num*5]=1;
  34. }
  35. }
  36. }

F - easy

题意:题目给了一个操作,即(a1, a2, · · · , an) → (|a1 − a2|, |a2 − a3|, · · · , |an − a1|),进行最多1000后,序列会变成一个循环或者全为零。
题解:进行一千次操作,若不全为零即为循环,否则为zero.

  1. #include<iostream>
  2. #include<cmath>
  3. using namespace std;
  4. int main(){
  5. int t;
  6. cin>>t;
  7. while(t--){
  8. int num[20],n,head;
  9. cin>>n;
  10. for(int i = 0 ; i < n ; i++){
  11. cin>>num[i];
  12. }
  13. for(int i = 0 ; i < 1000; i++){
  14. head = num[0];
  15. for(int j = 0 ; j < n ; j++){
  16. if(j!=n-1)
  17. num[j]=abs(num[j]-num[j+1]);
  18. else
  19. num[j]=abs(num[j]-head);
  20. }
  21. }
  22. int k = 0;
  23. for(int i = 0 ; i < n; i++){
  24. if(num[i])
  25. k=1;
  26. }
  27. if(k)
  28. cout<<"LOOP"<<endl;
  29. else
  30. cout<<"ZERO"<<endl;
  31. }
  32. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注