poj 2051 Argus

//这道题就是说,给你个id号,给你个周期,然后每个周期就会输出一次id,对于测试样例,200先输出一次2004,然后300输出2005,400的时候就是2004,600时候两个都要输出,那么按id的升序输出2004然后2005,输出了5个数据了,结束了···
//前面说的全是废话,但是需要注意其周期为0的时候,就相当于优先级是最高的,所以总是输出其周期为0的且id号最小的那个! 
#include <iostream>
#include <string>
#include <set>
#include <algorithm>
using namespace std;

struct Info
{
     string str;
     int num;
     int p;
}re[1005];

bool cmp(Info a, Info b)
{
     return a.p < b.p;
}

set<int> ans;
set<int>::iterator it;

int main()
{
    int i, k, j, l, c, temp;
    bool flag;
    for (i = 0; i < 1005; i++)
    {
        cin >> re[i].str;
        if (re[i].str == "#") break;
        else  cin >> re[i].num >> re[i].p;
    }
    sort(re, re+i, cmp);
    
    temp = re[0].p;
    cin >> k;
    ans.clear();
    c = 0;
    flag = false;
    while (1)
    {
          if (temp == 0)
          {
              for (j = 0; j < k; j++)
                 cout << re[0].num << endl;
              break;
          }
          for (j = 0; j < i; j++)
          {
              if (temp % re[j].p == 0)
                 ans.insert(re[j].num);
          }
          for (it = ans.begin(); it != ans.end(); it++)
          {
              cout << (*it) << endl;
              c++;
              if (c == k)
              {
                  flag = true;
                  break;
              }
          }
          if (flag) break;
          temp++;
          ans.clear();
    }
       
    system("pause");
}

/*
Register 2002 1
Register 2003 0
Register 2004 200
Register 2005 300
#
5

Register 2002 0
Register 2003 0
Register 2004 0
#
5

Register 2002 1
Register 2003 1
Register 2004 1
#
5
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值