codevs2830 蓬莱山辉夜

    xiaoxiao2021-04-16  28

    2830蓬莱山辉夜   题目描述  Description

    在幻想乡中,蓬莱山辉夜是月球公主,居住在永远亭上,二次设定说她成天宅在家里玩电脑,亦称NEET姬一天,她要她帮忙升级月球的网络服务器,应为注册用户过多(月兔和地球上的巫女都注册了……),所以作为代理管理员(俗称网管)的她,非常蛋疼。注册用户格式:TouhouMaiden 2004 200其中前面的Touhoumaiden是预设,不做更改,第一个数是标识,第二个数是每次接受信息访问的间隔用时。你要做的事,就是给定一群用户及n,求出这n次信息访问中,访问到了谁?

    presented by Izayoi sakuya

    输入描述  Input Description

    以题目预设格式输入,另起一行以‘#’结束,在其一行输入n

    输出描述  Output Description

    n行,每行输出第行次后,信息访问到了谁?若在一个时间有若干少女被访问到,输出字典序最小的那位少女的标识

    样例输入  Sample Input TouhouMaiden 2004 200 TouhouMaiden 2005 300 # 5 样例输出  Sample Output 2004 2005 2004 2004 2005 数据范围及提示  Data Size & Hint

    标识和每次信息访问间隔均在integer内,n<=10000

    原本是要用到堆,但深搜+时间即可搞定

    数据有点少但也都够变态了

     

    以时间为关键字将每个用户压入堆

    每次输出最先被访问到的用户,

    并把时间加上他的时间间隔再重新压入堆。

    具体做法是。定义优先队列,把时间最短、序号最小作为优先级,且时间比序号更优先。向优先队列中插入元素,于是形成了一个小根堆,要求的值就是堆顶元素的标识。

    如何再求下一个,下下个?我们知道,题目中的时间是累加的,且每个用户被访问后都有一个间隔时间,也就是说,下一个要访问这个用户的话一定会在这个时间段之后,就把他相对初始时的时间改为累加后的和,t.time=t.tme+t.cur,当然,这个式子中的t.cur就是这个用户被访问后的间隔时间,t.time在累加之中,表示他是在从刚开始数的哪个时刻被访问。

    #include<iostream> #include<queue> #include<vector> using namespace std; struct node{ int id,time,cur; }them[100000]; struct cmp_node{ bool operator()(node &a,node &b) { if(a.time!=b.time) {return a.time>b.time;} else {return a.id>b.id;} return false; } }; priority_queue<node,vector<node>,cmp_node>heap; int n; int main() { string s; cin>>s; int i=0; while(s!="#") { i++; cin>>them[i].id>>them[i].time>>s; them[i].cur=them[i].time; heap.push(them[i]); } cin>>n; for(int i=1;i<=n;i++) { node t=heap.top(); heap.pop(); cout<<t.id<<endl; t.time=t.time+t.cur; heap.push(t); } }

     

    转载请注明原文地址: https://ju.6miu.com/read-672070.html

    最新回复(0)