【问题背景】
小 h 前往美国参加比赛。小 h 的女朋友发现小 h 上午十点出发,上午十二点到达
美国,于是感叹到“现在飞机飞得真快,两小时就能到美国了”。
小 h 对超音速飞行感到十分恐惧。仔细观察后发现飞机的起降时间都是当地时间。
由于北京和美国东部有 12 小时时差,故飞机总共需要 14 小时的飞行时间。
不久后小 h 的女朋友去中东交换。小 h 并不知道中东与北京的时差。但是小 h 得
到了女朋友来回航班的起降时间。小 h 想知道女朋友的航班飞行时间是多少。
【问题描述】
对于一个可能跨时区的航班,给定来回程的起降时间。假设飞机来回飞行时间相
同,求飞机的飞行时间。
【输入格式】
从文件 timezone.in 中读入数据。
一个输入文件包含多组数据。
输入第一行为一个正整数 T,表示输入数据组数。
每组数据包含两行,第一行为去程的起降 时间,第二行为回程的起降 时间。
起降时间的格式如下
h1:m1:s1 h2:m2:s2h1:m1:s1 h3:m3:s3 (+1)h1:m1:s1 h4:m4:s4 (+2)
表示该航班在当地时间 h1 时 m1 分 s1 秒起飞;
第一种格式表示在当地时间当日 h2 时 m2 分 s2 秒降落;
第二种格式表示在当地时间次日 h3 时 m3 分 s3 秒降落;
第二种格式表示在当地时间第三天 h4 时 m4 分 s4 秒降落。
对于此题目中的所有以 h:m:s 形式给出的时间,保证 0 ≤ h ≤ 23, 0 ≤ m, s ≤ 59;对
于不足两位数的情况,保证添加了前导零补齐两位。
第 2 页 共 8 页
NOIP 模拟题 第 13 套 飞行时间(timezone)
【输出格式】
输出到文件 timezone.out 中。
对于每一组数据输出一行一个时间 hh:mm:ss,表示飞行时间为 hh 小时 mm 分
ss 秒。
注意,当时间为一位数时,要补齐前导零。如三点四分五秒应写为 03:04:05。
送分的SB题挂了
原因是我没有写gets
输入卡了,导致输出少了一个
这个故事告诉我们,gets可以将一整行读入,直到回车
tips:空格也算一个字符
下面给出代码:
#include<iostream> #include<algorithm> #include<cstring> #include<string> #include<cmath> #include<cstdio> #include<cstdlib> using namespace std; inline int rd(){ int x=0,f=1; char ch=getchar(); for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1; for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0'; return x*f; } inline void write(int x){ if(x<0) putchar('-'),x=-x; if(x>9) write(x/10); putchar(x%10+'0'); return ; } int n; char s1[106],s2[106],e1[106],e2[106]; char add1[106],add2[106]; int h1,h2,m1,m2,se1,se2; int ans=0; int ansh,ansm,anss; void change(){ int l1=strlen(e1+1),l2=strlen(e2+1); h1=((e1[1]-'0')*10+(e1[2]-'0'))-((s1[1]-'0')*10+(s1[2]-'0')); h2=((e2[1]-'0')*10+(e2[2]-'0'))-((s2[1]-'0')*10+(s2[2]-'0')); m1=((e1[4]-'0')*10+(e1[5]-'0'))-((s1[4]-'0')*10+(s1[5]-'0')); m2=((e2[4]-'0')*10+(e2[5]-'0'))-((s2[4]-'0')*10+(s2[5]-'0')); se1=((e1[7]-'0')*10+(e1[8]-'0'))-((s1[7]-'0')*10+(s1[8]-'0')); se2=((e2[7]-'0')*10+(e2[8]-'0'))-((s2[7]-'0')*10+(s2[8]-'0')); if(strlen(add1+1)==4) h1+=(add1[3]-'0')*24; if(strlen(add2+1)==4) h2+=(add2[3]-'0')*24; return ; } void solve(){ ans=h1*3600+m1*60+se1+h2*3600+m2*60+se2; ans/=2; ansh=ans/3600; ans%=3600; ansm=ans/60; ans%=60; anss=ans; return ; } char a[10006],b[10006]; void init(){ gets(a+1),gets(b+1); memset(add1,0,sizeof(add1)); memset(add2,0,sizeof(add2)); for(int i=1;i<=8;i++) s1[i]=a[i]; for(int i=10;i<=17;i++) e1[i-9]=a[i]; for(int i=19;i<=strlen(a+1);i++) add1[i-18]=a[i]; for(int i=1;i<=8;i++) s2[i]=b[i]; for(int i=10;i<=17;i++) e2[i-9]=b[i]; for(int i=19;i<=strlen(b+1);i++) add2[i-18]=b[i]; ans=0; return ; } void output(){ if(ansh<10) printf("0%d",ansh); else printf("%d",ansh); if(ansm<10) printf(":0%d",ansm); else printf(":%d",ansm); if(anss<10) printf(":0%d",anss); else printf(":%d",anss); puts(""); return ; } int main(){ n=rd(); while(n--){ init(); change(); solve(); output(); } return 0; }