自动取款

Description

银行规定了一种新的取款制度:一人一卡制,即如果某个人要同时从两张卡中取款,

那么他从第一张中取完后,必须排到队尾,第二次轮到他的时候才能再次取款。多张卡的话,以此类推。

[任务]

读入每一个人的来银行的时刻,和他的卡数;

假设从每一张卡中取款的用时都是2分钟,求出时间最长的人的号码和时间(一个人的时间为他来银行到他离开银行的时间);

Format

Input

每行两个自然数,前一个表示某人的来银行的时刻M,后一个表示这个人的卡数C。

最后用一个0结尾。数据已经按照人们来银行的时刻排好了顺序。 其中1<=M<=1440,1<=C<=5,人数不超过30。

Output

用一个空格隔开的两个自然数,前一个表示在银行时间最长的人的号码(若有多个则输出第一个),后一个表示这个人的在银行的时间。

Samples

输入数据 1

1 1
5 1
8 2
10 1
13 1
0

Copy

输出数据 1

3 6

思路(代码):

#include<bits/stdc++.h>
using namespace std;
bool ln[10201];
long long n,f,z1[100001],z2[100001],z9[100001],z11[100001],z0,z3,u,l,p,p0,lu;
queue<int> q;
struct ll{
	int a,b;
}z[1000001];
map<long long,long long> t;
int main(){
    //cin>>n;
    for(long long int i=1;;i++){
    	cin>>z[i].a;
    	z1[z[i].a]=i;
    	if(z[i].a==0){
			n=i-1;
			break;
		}
		ln[z[i].a]=1;
		cin>>z[i].b;
		z2[i]=z[i].b;
	}
	for(int i=1;i<=10001;i++){
		if(ln[i]==1){
			q.push(z1[i]);
			z11[z1[i]]=0;
			z9[z1[i]]=1;
			//cout<<i<<":"<<q.front()<<" "<<z1[i]<<endl;
		}
		if(lu==1){
			lu=0;
				z0=0;
				z2[q.front()]--;
				p=q.front();
				p0=z2[q.front()];
				if(p0>=1){
					u=p;
					q.push(p);
					q.pop();
					z9[p]=1;
				}
				else if(p0==0){					
					//f=max(z11[z1[q.front()]],f);
					if(z11[p]>f){
						f=z11[p];
						l=p;
					}
					z11[p]=0;
					z9[p]=0;
					q.pop();
				}			
		}
		for(int j=1;j<=31;j++){
			if(z9[j]>=1){
				z11[j]++;
				//cout<<i<<" "<<j<<" "<<z11[j]<<endl;
			}	 
		}		
		if(q.empty()==0){
			z0++;
			//cout<<i<<":"<<q.front()<<endl;
			if(z0==2){
				lu=1;	
			}	
		}
	}
	cout<<l<<" "<<f;
}

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值