首页 > 代码库 > Poj 2051 Argus
Poj 2051 Argus
题意理解:
(1)每个注册用户均有一个注册ID和一个时间间隔
(2)针对每隔用户,每隔一个自己的时间间隔该ID打印一次
(3)#说明输入到结尾处,没有用户注册了
(4)最后一行的数字为打印的次数
使用了一个优先权队列,把所有的注册用户放入该队列中,队列的排序按照要出现的时间从小到大排序,如果时间有冲突就按照id升序。每次这个用户id输出后,先把该用户从队列里pop出来,然后把该用户的出现时间加上他的时间间隔,然后再push到优先权队列中,由于这个队列是按照要求排序的,所以每次在队头的那个元素就是要打印的ID
1 #include <iostream> 2 #include <queue> 3 #include <string> 4 using namespace std; 5 struct node{ 6 int IntIdNum;//用户注册的ID 7 int IntPeroid;//间隔时间 8 int IntNextTime;//下次出现的时间 9 friend bool operator <(node a,node b){//运算符重载10 if(a.IntNextTime != b.IntNextTime)11 return (a.IntNextTime > b.IntNextTime);//时间不等按时间输出12 else return (a.IntIdNum > b.IntIdNum);//时间相等按id输出13 }14 };15 int Id,peroid,OutNum;16 int main()17 {18 //freopen("D:\\t.txt","r",stdin);19 20 string str;21 priority_queue <node> SaveQue;//创建优先队列,‘<‘对Push进去的数据进行处理22 while(cin>>str && str != "#"){23 cin>>Id>>peroid;//输入及初始化24 node Input;25 Input.IntIdNum = Id;26 Input.IntPeroid = peroid;27 Input.IntNextTime = peroid;28 SaveQue.push(Input);29 }30 cin >> OutNum;31 for(int i = 0;i < OutNum;i++){32 node Output;33 Output = SaveQue.top();34 SaveQue.pop();35 cout<< Output.IntIdNum<<endl;36 Output.IntNextTime += Output.IntPeroid;//37 SaveQue.push(Output);38 }39 40 return 0;41 }
Poj 2051 Argus
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。