第二题

第二题

【题目描述】

  给你两个日期,问这两个日期差了多少毫秒。

【输入格式】

  两行,每行一个日期,日期格式保证为“YYYY-MM-DD hh:mm:ss”这种形式。第二个日期时间一定比第一个日期时间要大两个日期的年份一定都是21世纪的年份。

【输出格式】

  一行一个整数代表毫秒数。

【样例输入1】

  2000-01-01 00:00:00

  2000-01-01 00:00:01

【样例输出1】

  1000

【样例输入2】

  2000-01-01 00:00:00

  2000-11-11 00:00:00

【样例输出2】

27216000000

【样例解释】

  从前有座山。

【数据范围与规定】

  对于10%的数据,两个日期相同。

  对于20%的数据,两个日期只有秒数可能不同。

  对于30%的数据,两个日期只有秒数、分钟数可能不同。

  对于40%的数据,两个日期的年月日一定相同。

  对于60%的数据,两个日期的年月一定相同。

  对于80%的数据,两个日期的年份一定相同。

  对于100%的数据,两个日期一定都是21世纪的某一天,且第二个日期一定大于等于第一个日期。

【题目分析】

  考试过程中绕来绕去特判好久,最后只拿了三十分,最后长者告诉我们,c++的STL中有个ctime库有个什么玩意可以计算两个时间之间的秒数,这样就有四十分了

/*

  ctime 主要是将一个time_t的变量格式化输出成标准时间的格式
  比如 time_t a=time(NULL);
  这时候a 的值为一个long数,是从标准时间到当前时间的秒数
  而 char* pt=ctime(&a);这时候你输出字符串pt,就是现在的标准时间,年月日时分秒

*/

//好恶心
//自己的代码终于搞到了40分,最后一个特判的减号写成了加号,我先冷静一下

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int a[3][10];
long long ans=0;

inline int read()
{
    char ch;
    long long a = 0;
    bool b = 0;
    while(!((((ch=getchar())>='0')&&(ch<='9'))||(ch=='-')));
    ch == '-'?b = 1:a = ch - '0';
    while(((ch = getchar()) >= '0') && (ch <= '9')) a = a * 10 + ch - '0';
    return b?-a:a;
}
int main()
{
    freopen("two.in","r",stdin);
    freopen("two.out","w",stdout);
    for(int i=1;i<=2;i++)
        for(int j=1;j<=6;j++)
            a[i][j]=read();
    if(a[1][1]==a[2][1]&&a[1][2]==a[2][2]&&a[1][3]==a[2][3]&&a[1][4]==a[2][4]&&a[1][5]==a[2][5]&&a[1][6]==a[2][6])//xiangtong
        printf("0");
    else if(a[1][1]==a[2][1]&&a[1][2]==a[2][2]&&a[1][3]==a[2][3]&&a[1][4]==a[2][4]&&a[1][5]==a[2][5]&&a[1][6]!=a[2][6])
        printf("%d000",a[2][6]-a[1][6]);
    else if(a[1][1]==a[2][1]&&a[1][2]==a[2][2]&&a[1][3]==a[2][3]&&a[1][4]==a[2][4])
    {
        if(a[2][6]>=a[1][6])
        {
            ans=a[2][6]-a[1][6];
            ans+=((a[2][5]-a[1][5])*60);
        }
        else
        {
            ans=a[2][6]+60-a[1][6];
            a[2][5]--;
            int ans1=(a[2][5]-a[1][5])*60;
            ans+=ans1;
        }
        printf("%I64d000",ans);
    }
    else if(a[1][1]==a[2][1]&&a[1][2]==a[2][2]&&a[1][3]==a[2][3])//只有年月日相同 
    {
        if(a[2][5]>=a[1][5]&&a[2][6]>=a[1][6])
            ans=(a[2][4]-a[1][4])*3600+(a[2][5]-a[1][5])*60+(a[2][6]-a[1][6]);
        else if(a[2][5]>=a[1][5]&&a[2][6]<a[1][6])
        {
            ans=a[2][6]+60-a[1][6];
            a[2][5]--;
            int ans1=(a[2][5]-a[1][5])*60;
            ans+=ans1;
            ans+=((a[2][4]-a[1][4])*3600);
        }
        else if(a[2][5]<a[1][5]&&a[2][6]>=a[1][6])
        {
            ans=a[2][6]-a[1][6];
            int ans1=(a[2][5]+60-a[1][5])*60;
            a[1][4]++;
            ans+=ans1;
            ans+=((a[2][4]-a[1][4])*3600);
        }
        else if(a[2][5]<a[1][5]&&a[2][6]<a[1][6])
        {
            int ans2=(a[2][4]-a[1][4])*3600;//here
            int ans1=(a[1][5]-a[2][5])*60+a[1][6]-a[2][6];
            ans=ans2-ans1;
        }
        printf("%I64d000",ans);
    }
    if(a[1][1]!=a[1][2])
    {
        
    }
    fclose(stdin);fclose(stdout);
    return 0;
}
/*
2000-01-01 20:23:58
2000-01-01 21:28:01
*/
蒟蒻
//钟神强悍的40分
#include <cstdio>
#include <cstring>
#include <ctime>
#include <iostream>
#include <cmath>
using namespace std;

int year,month,day,hour,minute,second;
tm *s,*t;
int main()
{
    freopen("two.in","r",stdin);
    freopen("two.out","w",stdout);
    scanf("%d-%d-%d %d:%d:%d",&year,&month,&day,&hour,&minute,&second);
    s=new tm();
    s->tm_year=year-1900;s->tm_mon=month-1;s->tm_mday=day;s->tm_hour=hour;s->tm_min=minute;s->tm_sec=second;
    scanf("%d-%d-%d %d:%d:%d",&year,&month,&day,&hour,&minute,&second);
    t=new tm();
    t->tm_year=year-1900;t->tm_mon=month-1;t->tm_mday=day;t->tm_hour=hour;t->tm_min=minute;t->tm_sec=second;
    printf("%I64d
",(long long)fabs(difftime(mktime(s),mktime(t)))*1000);
    fclose(stdin);fclose(stdout);
    return 0;
}
钟神

 事实上,算出两个时间距离2000年(因为数据保证都是20世纪)的秒数直接相减就可以了

#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
ll nian1,nian2,yue1,yue2,ri1,ri2,shi1,shi2,fen1,fen2,miao1,miao2;
ll now,pre;
ll Mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
char s1[110],s2[110],c1[110],c2[110];
ll read()
{
    char ch;
    long long a=0;
    bool b=0;
    while(!((((ch=getchar())>='0')&&(ch<='9'))||(ch=='-')));
    ch=='-'?b=1:a=ch-'0';
    while(((ch=getchar())>='0')&&(ch<='9'))
        a=a*10+ch-'0';
    return b?-a:a;
}
ll Is(ll x){
    return (x%400==0)||(x%100&&x%4==0);
}
ll Nian(ll x){
    if(Is(x))return 366;
    else return 365;
}
int main()
{
    freopen("two.in","r",stdin);
    freopen("two.out","w",stdout);
    nian1=read();yue1=read();ri1=read();shi1=read();fen1=read();miao1=read();
    nian2=read();yue2=read();ri2=read();shi2=read();fen2=read();miao2=read();
    for(int i=2000;i<nian2;i++)
        now+=Nian(i);
    for(int i=1;i<yue2;i++)
        now+=Mon[i];
    if(Is(nian2)&&yue2>2)now++;
    now+=ri2-1;now=now*24;//shi
    now+=shi2;now*=60;now+=fen2;// fen
    now*=60;now+=miao2;//miao
    
    for(int i=2000;i<nian1;i++)
        pre+=Nian(i);
    for(int i=1;i<yue1;i++)
        pre+=Mon[i];
    if(Is(nian1)&&yue1>2)pre++;
    pre+=ri1-1;pre=pre*24;//shi
    pre+=shi1;pre*=60;pre+=fen1;// fen
    pre*=60;pre+=miao1;//miao
    
    cout<<(now-pre)*1000<<endl;
    return 0;

}
正解刮开
原文地址:https://www.cnblogs.com/xiaoningmeng/p/6029140.html