@yuyuesheng
2019-01-25T17:09:32.000000Z
字数 1715
阅读 771
题意:有两种操作,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]);
else
num[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;
else
cout<<"ZERO"<<endl;
}
}