HDU-6308 Time Zone

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=6308

HDU-6308 Time Zone

题目分析:

    关键是注意时区的格式和X,Y的取值范围,然后考虑正负,计算出与+8区相差的时间。比较好的思路是直接把小时化成分钟,最后用分钟计算几时几分。因为格式比较简单,可以通过string的长度为5,6,7..进行分布分析,对于X.Y的处理如果用double的话需要考虑精度问题,可以加一个eps然后取整。

#include<iostream>
#include<string>
#include<cstdio> 
using namespace std;
int main(void)
{
	int n;
	cin>>n; 
	while(n--)
	{
		int a,b;
		string s;
		cin>>a>>b>>s;
        int sum = a*60+b;
        int t = 0;
		bool flag1 = false; //记录+ -
		bool flag2 = false; //记录 . 
		if(s[3]=='+'){
			flag1 = true;
		}
		int i = 4;
		for(;i<s.length();i++)
		{
			if(s[i]=='.'){
				flag2 = true;
				break;		
			}
			else{
				t = t*10+(s[i]-'0'); 
			}
		}
		t*=60; 
		if(flag2){
			t += (s[i+1]-'0')*6;
		}
		if(flag1){
			sum += t - 8*60;
		}
		else{
			sum += -1*t-8*60;
		}
		if(sum<0){
			sum+=60*24;
		}
		printf("%02d:%02d\n",sum/60%24,sum%60);
	}
}

#include <bits/stdc++.h>
#define eps 1e-10
using namespace std;
typedef long long LL;
int main()
{
    int t, h, m;
    char s[10];
    cin>>t;
    while(t--)
    {
        scanf("%d%d%s", &h, &m, s);
        h = h*60+m;
        int op = s[3]=='+'?1:-1;
        double x;
        sscanf(s+4, "%lf", &x);
        x = (int)(x*10+eps); 
        int cha = x*6*op-8*60;
        h = (h+cha)%(24*60);
        if(h < 0) h += 24*60;
        printf("%02d:%02d\n", h/60, h%60);
    }
    return 0;
}