zoukankan      html  css  js  c++  java
  • 【hihocoder 1477】闰秒

    【题目链接】:http://hihocoder.com/problemset/problem/1477

    【题意】

    中文题

    【题解】

    首先,一年一年地加,把开始的年份和结束的年份之间的年根据是否为闰年;
    加上365天的秒和366天的秒;
    然后把开始的那一年的剩余天数加完;
    再把结束的那一年的1月1号开始一直加到结束的年的月日;
    把有闰秒的年月日;
    判断一下,在不在两个日期之间;
    (严格在两个日期之间,不能相等);
    我的程序,算的时候,右端点严格会被算到;
    在的话,ans++;

    【Number Of WA

    8

    【完整代码】

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #define LL long long
    
    using namespace std;
    
    const int MAXN = 5000+100;
    
    struct abc
    {
        int year,month,day,hour,minute,second;
    };
    
    int n;
    int a[MAXN];
    abc ks,js,temp,tks,tjs;
    LL rest;
    int day[13];
    
    bool rn(int x)
    {
        if (!(x%4))
        {
            if (x%100)
                return true;
            else
            {
                if (x%400)
                    return false;
                else
                    return true;
            }
        }
        else
            return false;
    }
    
    void change(abc &ks)
    {
        if (ks.second>59)
        {
            ks.second=0;
            ks.minute++;
            if (ks.minute>59)
                {
                    ks.minute=0;
                    ks.hour++;
                    if (ks.hour == 24)
                    {
                        ks.hour=0;
                        ks.day++;
                        if (ks.day > day[ks.month])
                        {
                            ks.day = 1;
                            ks.month++;
                            if (ks.month > 12)
                                {
                                    ks.year++;
                                    ks.month = 1;
                                }
                        }
                    }
                }
        }
    }
    
    int bijiao(abc a,abc b)
    {
        if (a.year != b.year)
            return a.year<b.year;
        if (a.month!=b.month)
            return a.month<b.month;
        if (a.day !=b.day)
            return a.day < b.day;
        if (a.hour!=b.hour)
            return a.hour < b.hour;
        if (a.minute!=b.minute)
            return a.minute < b.minute;
        if (a.second!=b.second)
            return a.second<b.second;
        return -1;
    }
    
    bool ok()
    {
        int ju1 = bijiao(tks,temp),ju2 = bijiao(temp,tjs);
        if (ju1==1 && ju2==1)
            return true;
        return false;
    }
    
    void pd(int x)
    {
        temp.year = x;
        if (ok()) rest++;
    }
    
    int main()
    {
        //freopen("D:\rush.txt","r",stdin);
        scanf("%d-%d-%d %d:%d:%d",&ks.year,&ks.month,&ks.day,&ks.hour,&ks.minute,&ks.second);
        scanf("%d-%d-%d %d:%d:%d",&js.year,&js.month,&js.day,&js.hour,&js.minute,&js.second);
        tks = ks,tjs = js;
        rest = 0;
        for (int i = ks.year+1;i <= js.year-1;i++)
            if (rn(i))
                rest+=31622400;
            else
                rest+=31536000;
        day[1] = day[3] = day[5] = day[7] = day[8] = day[10] = day[12] = 31;
        day[4] = day[6] = day[9] = day[11] = 30;
        if (ks.year<js.year)
        {
            int goal = ks.year+1;
            if (rn(ks.year))
                day[2] = 29;
            else
                day[2] = 28;
            while (ks.year<goal)
            {
                ks.second++;
                rest++;
                change(ks);
            }
            ks.year = js.year;
            if (rn(ks.year))
                day[2] = 29;
            else
                day[2] = 28;
            while (ks.month < js.month || ks.day < js.day || ks.hour < js.hour || ks.minute < js.minute)
            {
                rest++;
                ks.second++;
                change(ks);
            }
            rest+=js.second-ks.second;
        }
        else
            if (ks.year == js.year)
            {
                if (rn(ks.year))
                    day[2] = 29;
                else
                    day[2] = 28;
                while (ks.month < js.month || ks.day < js.day || ks.hour < js.hour || ks.minute < js.minute)
                {
                    rest++;
                    ks.second++;
                    change(ks);
                }
                rest+=js.second-ks.second;
            }
        temp.month = 6,temp.day = 30,temp.hour = 23,temp.minute = 59,temp.second = 60;
    
        //6/30 23:59:60
        pd(1972);
        for (int i = 1981;i<=1983;i++) pd(i);
        pd(1985);
        for (int i = 1992;i<=1994;i++) pd(i);
        pd(1997);
        pd(2012);
        pd(2015);
        temp.month = 12,temp.day = 31;
    
        for (int i = 1972;i<=1979;i++) pd(i);
        pd(1987);
        for (int i = 1989;i <= 1990;i++) pd(i);
        pd(1995);
        pd(1998);
        pd(2005);
        pd(2008);
        pd(2016);
    
        cout << rest << endl;
        return 0;
    }
  • 相关阅读:
    中国大学MOOC-数据结构基础习题集、07-2、Insert or Merge
    NSDate相关
    切换中文键盘时覆盖输入框的完美解决方案
    自定义UITableView的右侧索引
    调用系统的短信和发送邮件功能,实现短信分享邮件分享
    程序出现警告,解决方式
    键盘隐藏问题
    java修饰符
    java覆盖和隐藏
    java嵌套类
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626303.html
Copyright © 2011-2022 走看看