@yuyuesheng
2019-01-25T09:09:32.000000Z
字数 1715
阅读 883
题意:有两种操作,ENQUEUE操作是将某元素插入团队中,将元素插入团队的情况有两种,若团队中已有该元素所属小组的元素,则插在与它相同小组元素的后面,若团队中没有该元素所属小组的元素,则将此元素插入团队的尾端。DEQUEUE是取出团队的元素。
题解:用两个队列,一个队列存团队中小组的顺序,一个队列存小组元素在团队出现的顺序。
#include<iostream>#include<queue>#include<map>using namespace std;char cmd[10];int main(){int t,cnt,ele,num,id,cas=0;while(1){cin>>t;if(t==0)break;cout<<"Scenario #"<<++cas<<endl;map<int,int>m;queue<int>team,q[1500];for(int i = 0 ; i < t ; i++){cin>>cnt;for(int j = 0 ; j < cnt ; j++){cin>>ele;m[ele]=i;}}while(1){cin>>cmd;if(cmd[0]=='S')break;else if(cmd[0]=='E'){cin>>num;id = m[num];if(q[id].empty())team.push(id);q[id].push(num);}else{id = team.front();cout<<q[id].front()<<endl;q[id].pop();if(q[id].empty())team.pop();}}cout<<endl;}}
题意:定义素数因数只含2,3,5的数为丑数,求出第1500个丑数。
题解:如果x是丑数,那么2x,3x,4x,5x也一定为丑数,所以不断的抽取最小的丑数打表直至第1500个元素。标记已统计的元素,避免重复计数.会爆int
#include<iostream>#include<map>#include<queue>using namespace std;typedef long long ll;priority_queue<ll,vector<ll>, greater<ll> > q;map<ll,int>m;int main(){int cnt = 0;q.push(1);while(1){ll num = q.top();q.pop();cnt++;if(cnt == 1500){cout<<"The 1500'th ugly number is "<<num<<"."<<endl;break;}if(m[num*2]==0){q.push(num*2);m[num*2]=1;}if(m[num*3]==0){q.push(num*3);m[num*3]=1;}if(m[num*4]==0){q.push(num*4);m[num*4]=1;}if(m[num*5]==0){q.push(num*5);m[num*5]=1;}}}
题意:题目给了一个操作,即(a1, a2, · · · , an) → (|a1 − a2|, |a2 − a3|, · · · , |an − a1|),进行最多1000后,序列会变成一个循环或者全为零。
题解:进行一千次操作,若不全为零即为循环,否则为zero.
#include<iostream>#include<cmath>using namespace std;int main(){int t;cin>>t;while(t--){int num[20],n,head;cin>>n;for(int i = 0 ; i < n ; i++){cin>>num[i];}for(int i = 0 ; i < 1000; i++){head = num[0];for(int j = 0 ; j < n ; j++){if(j!=n-1)num[j]=abs(num[j]-num[j+1]);elsenum[j]=abs(num[j]-head);}}int k = 0;for(int i = 0 ; i < n; i++){if(num[i])k=1;}if(k)cout<<"LOOP"<<endl;elsecout<<"ZERO"<<endl;}}