桐桐的新闻系统【模拟】

编程入门 行业动态 更新时间:2024-10-26 21:20:39

桐桐的新闻<a href=https://www.elefans.com/category/jswz/34/1770742.html style=系统【模拟】"/>

桐桐的新闻系统【模拟】

>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储存所有的用户IDcin>>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;
}

更多推荐

桐桐的新闻系统【模拟】

本文发布于:2023-07-28 21:47:43,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1327120.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:系统   新闻

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!