【题目描述】
纪中有自己的篮球联赛,简称JBA,比赛共48分钟,需要注意的是比赛没有罚篮,没有3分球,所以每次得分一定是得2分。当比赛结束时,各项技术统计就应该出炉。作为记分员的你负责记录每一次的得分情况,现在你突然对两支队伍领先持续的总时间感兴趣。
【输入】
第一行包含一个整数N(1<=N<=100),接下来N行,每行描述一次得分。
每个得分描述包含得分的队伍编号1或2,还包含得分时刻MM:SS(MM表示分,范围为[00,47],SS表示秒,范围为[00,59]),队伍和时刻之间用一个空格隔开。
【输出】
输出两行,分别表示队伍1和队伍2领先的时间。时间用MM:SS表示。
【样例输入】
样例输入1
1
1 20:00
样例输入2
3
1 01:10
2 21:10
2 31:30
样例输入3
5
1 01:10
1 02:20
2 45:30
2 46:40
2 47:50
【样例输出】
样例输出1
28:00
00:00
样例输出2
20:00
16:30
样例输出3
45:30
00:10
【思路】
按每次得分来模拟,注意模拟结束后记得再判断一次进位。
【AC代码】
#include<iostream>
#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
int n,p[1001],a[1001],b[1001];
int fa=0,fb=0;
int a1,a2,b1,b2;
int ansa1=0,ansa2=0,ansb1=0,ansb2=0;
int main(){
freopen("b.in","r",stdin);
freopen("b.out","w",stdout);
cin>>n;
char ch;
for(int i=1;i<=n;i++){
cin>>p[i]>>a[i];
cin>>ch;
cin>>b[i];
}
int flag=0;
for(int i=1;i<=n;i++){
if(p[i]==1){
fa++;
}else if(p[i]==2){
fb++;
}
if(flag==1){
if(fb>fa){
flag=2;
ansa1+=(a[i]-a1);
ansa2+=(b[i]-a2);
b1=a[i];
b2=b[i];
a1=0;
a2=0;
}else if(fb==fa){
flag=0;
ansa1+=(a[i]-a1);
ansa2+=(b[i]-a2);
a1=0;
a2=0;
}
}else if(flag==2){
if(fa>fb){
flag=1;
ansb1+=(a[i]-b1);
ansb2+=(b[i]-b2);
b1=0;
b2=0;
a1=a[i];
a2=b[i];
}else if(fb==fa){
flag=0;
ansb1+=(a[i]-b1);
ansb2+=(b[i]-b2);
b1=0;
b2=0;
}
}else if(flag==0){
if(fa>fb){
a1=a[i];
a2=b[i];
}else{
b1=a[i];
b2=b[i];
}
}
if(fa>fb)flag=1;
else if(fb>fa)flag=2;
else flag=0;
ansa1+=(ansa2/60);
ansb1+=(ansb2/60);
ansa2=ansa2%60;
ansb2=ansb2%60;
}
if(a1||a2){
ansa1+=(47-a1);
ansa2+=(60-a2);
}
if(b1||b2){
ansb1+=(47-b1);
ansb2+=(60-b2);
}
ansa1+=(ansa2/60);
ansb1+=(ansb2/60);
ansa2=ansa2%60;
ansb2=ansb2%60;
if(ansb2<0){
ansb1--;
ansb2=60+ansb2;
}
if(ansa2<0){
ansa1--;
ansa2=60+ansa2;
}
printf("%02d:%02d\n",ansa1,ansa2);
printf("%02d:%02d",ansb1,ansb2);
fclose(stdin);
fclose(stdout);
return 0;
}