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;
}