科林明伦杯 - B Time

来源:互联网 发布:xps分析软件下载 编辑:程序博客网 时间:2024/05/01 14:42

Problem B. Time

Time Limit: 1000ms  Memory Limit: 100000k

Description

Kim是一个掌控时间的大师。不同于一般人,他习惯使用秒来计算时间。如果你问他现在是几点,他会告诉你现在是今天的xxxx秒。Mik想要考考Kim。他想知道从某一天的00:00:00开始,经过s秒后是哪一天。但是Mik不会计算答案,他需要你的帮助。

注意:我们认为一天从00:00:00开始,到23:59:59结束。00:00:00经过1秒后是00:00:01;从00:00:00开始,加8640060*60*24)秒后就是下一天的00:00:00.

Input

第一行一个整数T表示数据组数。

接下来T行,每行一个日期yyyy-MM-dd,接下来一个整数s表示s秒。

Output

对于每个输入,输出一行yyyy-MM-dd 表示答案。对于不足两位的数要补齐前导0

Sample

Input

Output

3

2016-12-10 1000

2016-02-28 86400

2016-01-01 1000000

2016-12-10

2016-02-29

2016-01-12

 

 

Hint

T<=100

s<=2147483647

日期在1800-01-012100-01-01之间

 

闰年的判断:

1.能被4整除且不能被100整除的为闰年.

2.能被400整除的是闰年.


这道题很简单的水题,可惜我做不对···找了很长时间的BUG  也没找出来

测试了很多数据 也都正确   ,求大神指出错误


WA代码

#include<stdio.h>int a[13]= {31,28,31,30,31,30,31,31,30,31,30,31};int jude(int a){    if(a%100!=0&&a%4==0||a%400==0)        return 1;    else        return 0;}int main(){    int t;    scanf("%d",&t);    while(t--)    {        int y,m,d,s;        scanf("%d-%d-%d",&y,&m,&d);        scanf("%d",&s);        int day0=0,day;        day=s/86400;        //printf("%d\n",day);        if(jude(y)==1)        {            a[1]=29;        }        for(int i=0;i<m-1;i++)        {            day0+=a[i];        }        day0+=d;        day+=day0;        //printf("%d\n",day);        int yd=365;        while(day>yd)        {            yd=365;            if(jude(y)==1)                yd=366;            if(day>yd)            {                y++;                day-=yd;                //printf("%d %d\n",y,jude(y));            }        }        int i=0,month=0;        //printf("%d\n",day);        a[1]=28;        if(jude(y)==1)        {            a[1]=29;        }        //printf("%d**\n",a[1]);        while(day>a[i])        {            day-=a[i];            //printf("%d\n",day);            i++;        }        if(y<10)            printf("0%d-",y);        if(y>=10)            printf("%d-",y);        if(i+1<10)            printf("0%d-",i+1);        if(i+1>=10)            printf("%d-",i+1);        if(day<10)        {            printf("0%d\n",day);        }        if(day>=10)        {            printf("%d\n",day);        }    }    return 0;}

下面直接再上一AC的 大神代码

%#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#include <iostream>#define FOR(i,j,k) for(int i=j;i<=k;i++)using namespace std;bool isleap(int y){    if ((y%4==0 && y%100!=0) || y%400==0)return true;    return false;}int maxday(int y,int m){    if (m==2)    {        if (isleap(y))return 29;        else return 28;    }    else    {        if (m==1 || m==3 || m==5 || m==7 || m==8 || m==10 || m==12)return 31;        else return 30;    }}int main (int argc, char *argv[]){    int noc;    int y,m,d;    int s;    scanf("%d",&noc);    while (noc--)    {        scanf("%d-%d-%d%d",&y,&m,&d,&s);        int ad=s/86400.0;        FOR(_,1,ad)        {            d++;            if (d>maxday(y,m))            {                d=1;                m++;            }            if (m==13)            {                m=1;                y++;            }        }        printf("%d-%.2d-%.2d\n",y,m,d);    }    return 0;}

 直接暴力搞简洁明了

当时怕超时   就把时间复杂度优化了一下

结果优化的 代码复杂了,也找不出BUG了




0 0
原创粉丝点击