桐桐的新闻系统
题目大意:
有n个人,每个人有自己的ID和收新闻的间隔,问前k次发送新闻是分别发给谁的
原题:
题目描述
桐桐为期末的电脑作业设计一套新闻系统,他把这套系统称为Argus。
使用这套系统的用户可以向这套系统注册,然后这套系统就会以用户要求发送新闻的时间间隔向用户发送一次新闻。
向Argus注册的指令具有一下格式:
Register Q_num Period
Q_num(0<Q_num≤3000)是用户的ID,Period(0<Q_num≤3000)是间隔。注册后Period秒,结果会第一次到达。
用户都有不同的Q_num。桐桐测试了一段时间后,想知道系统前K次发送给谁新闻了。如果同一时间发送多个新闻,以Q_num的升序排列。
输入
第一部分是注册指令,每行一条。指令数不超过1000,所有指令同时执行完,此部分以‘#’结束;第二部分仅一行,一个正整数K(K≤10000)。
输出
输出前K个新闻发送到的用户的Q_num,每行一个。
输入样例
Register 2004 200
Register 2005 300
#
5
输出样例
2004
2005
2004
2004
2005
解题思路:
每一次找时间最小的,然后记录下一次的时间,然后这样循环k遍
代码:
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
using namespace std;
int z,y,k,w,num,a[3050],b[3050];
char x;
string str;
int read()
{x=getchar();int l=0;while (x<'0'||x>'9') x=getchar();while (x>='0'&&x<='9') l=(l<<3)+(l<<1)+x-48,x=getchar();return l;
}
bool pd()//判断是否结束了
{x=getchar();while (x!='R'&&x!='#') x=getchar();return x=='R';
}
void writ(int c) {if (c>9) writ(c/10); putchar(c%10+48); return;}
void write(int s) {writ(s);putchar(10); return;}
int main()
{memset(b,127/3,sizeof(b));while (pd()){z=read();y=read();a[z]=y;//记录b[z]=y;}scanf("%d",&k);for (int i=1;i<=k;++i){num=0;for (int j=1;j<=3000;++j)//找最大的if (b[j]<b[num])num=j;write(num);b[num]+=a[num];//记录下一次接收的时间}
}