UVa540
采用数据结构与大概流程
1.使用map<int,int>
来保存队伍序号与队员的关系
2.用queue<int>
来模拟队列的操作
不难
代码实现
#include<iostream>
#include<queue>
#include <map>
#include <string>
using namespace std;
int main()
{
int N, t;
int num;
int count = 1;
map<int, int> savedMember; //队员名称 队列序号
queue<int> print;//用于输出操作
while (true)
{
queue<int> q;//team queue
queue<int> p[1001];//单个队列
//输入
cin >> t;
if (!t)
break;
for (int i = 1; i <= t; i++)
{
cin >> N;
for (int j = 0; j < N; j++)
{
cin >> num;
savedMember.insert({ num,i });
}
}
//处理输入指令
string order;
while (true)
{
cin >> order;
if (order[0] == 'S')
break;
else if (order[0] == 'E') //enqueue 101
{
cin>>num;
int temp = savedMember[num];
if (p[temp].empty())
q.push(temp);
p[temp].push(num);
}
else if (order[0] == 'D')
{
//cout << p[q.front()].front() << endl;
print.push(p[q.front()].front());
p[q.front()].pop();
if (p[q.front()].empty())
q.pop();
}
}
cout << "Scenario #"<<count << endl;
count++;
while (!print.empty())
{
cout << print.front()<<endl;
print.pop();
}
cout << endl;
//刷新数据结构存储状态
savedMember.clear();
}
//system("pause");
return 0;
}
UVa136
采用数据结构与大概流程
1.采用STL优先队列priority_queue来生成丑数,先将1放入队列,每次pop头出来,当pop1500次时即得出结果
priority_queue<type,container,function>
type是数据的类型,container为实现优先队列的底层容器,function为元素间的比较方式,默认priority_queue<int,vector<int>>
优先级是越小的整数优先级越低,但这题我们要从小到大生成丑数,所以越小的整数需要优先级越高,所以使用greater<>
,注意需要加入头文件#include<functional>
代码实现
/*思路:从最小的1开始生成丑数
每次从优先队列中取出最小的丑数依次*2,*3,*5
然后放入越小越优先的优先队列中
需要比较这个新生成的丑数是否之前生成过
用set可以实现
*/
#include<iostream>
#include<set>
#include<queue>
#include<vector>
#include<functional>
using namespace std;
typedef long long ll;
const int a[3]= { 2,3,5 };
int main()
{
int count = 1;
priority_queue<ll, vector<ll>, greater<ll> > p;
set<ll> Set;
p.push(1);
Set.insert(1);
while (true)
{
ll x = p.top();
p.pop();
if (count == 1500)
{
cout <<"The 1500'th ugly number is "<<x<<"."<<endl;
break;
}
for (int i = 0; i < 3; i++)
{
ll y = x;
y = y*a[i];
if (Set.count(y) == 0)
{
Set.insert(y);
p.push(y);
//cout << y << endl;
}
}
count++;
}
system("pause");
return 0;
}