桐桐的新闻系统【模拟】

>Description
用户可以注册,然后这套系统就会以用户要求发送新闻的时间间隔向用户发送一次新闻。
向Argus注册的指令具有一下格式:
Register Q_num Period
Q_num(0<Q_num≤3000)是用户的ID,Period(0<Q_num≤3000)是间隔。注册后Period秒,结果会第一次到达。
用户都有不同的Q_num。桐桐测试了一段时间后,想知道系统前K次发送给谁新闻了。如果同一时间发送多个新闻,以Q_num的升序排列。


>Input
第一部分是注册指令,每行一条。指令数不超过1000,所有指令同时执行完,此部分以‘#’结束;第二部分仅一行,一个正整数K(K≤10000)。

>Output
输出前K个新闻发送到的用户的Q_num,每行一个。


>Sample Input
Register 2004 200
Register 2005 300

5

>Sample Output
2004
2005
2004
2004
2005


>解题思路
又是模拟T_TT_T。
把输入的数x(用户ID),y(Period),分别存入数组:a[x]=y,b[x]=y。
然后每一次循环一遍所有的用户,根据b数组找出时间最短的那一个(如果有重复的,按照题意根据ID从小到大输出),输出ID;还有在此ID的b数组上在加上a,就如b[ID]+=a[ID],表示下一次此ID收到广告的时间。


>代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int k,tt,sum,s,x,y,minn,a[3005],b[3005],st[1005],cyz[1005];
string c;
bool lhq;
int main()
{
	cin>>c;
	while(c=="Register")
	{
		scanf("%d%d",&x,&y);
		a[x]=y; b[x]=y; st[++tt]=x; //st储存所有的用户ID
		cin>>c;
	}
	scanf("%d",&k);
	while(sum<k&&!lhq)
	{
		minn=-1; cyz[0]=0; cyz[1]=0; //minn表示最短时间,cyz数组储存最短时间的所有用户
		for(int i=1;i<=tt;i++)
		 if(b[st[i]]<minn||minn==-1) minn=b[st[i]],cyz[0]=1,cyz[1]=st[i];
		 else if(b[st[i]]==minn) cyz[++cyz[0]]=st[i];
		sort(cyz+1,cyz+1+cyz[0]); //把用户排个序
		for(int i=1;i<=cyz[0];i++)
		{
			printf("%d\n",cyz[i]);
			sum++;
			if(sum==k) {lhq=1; break;} //如果已经输出了k个就退出
			b[cyz[i]]+=a[cyz[i]]; //下一次的时间
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43010386/article/details/92117166
今日推荐