• HDU 6112.今夕何夕-蔡勒公式 (2017"百度之星"程序设计大赛


    1005:今夕何夕

    Time Limit: 2000/1000 MS (Java/Others)
    Memory Limit: 32768/32768 K (Java/Others)  
     

    Problem Description

    今天是2017年8月6日,农历闰六月十五。

    小度独自凭栏,望着一轮圆月,发出了“今夕何夕,见此良人”的寂寞感慨。

    为了排遣郁结,它决定思考一个数学问题:接下来最近的哪一年里的同一个日子,和今天的星期数一样?比如今天是8月6日,星期日。下一个也是星期日的8月6日发生在2023年。

    小贴士:在公历中,能被4整除但不能被100整除,或能被400整除的年份即为闰年。

    Input

    第一行为T,表示输入数据组数。

    每组数据包含一个日期,格式为YYYY-MM-DD。

    1 ≤ T ≤ 10000

    YYYY ≥ 2017

    日期一定是个合法的日期

    Output

    对每组数据输出答案年份,题目保证答案不会超过四位数。

    Sample Input

    3
    2017-08-06
    2017-08-07
    2018-01-01

    Sample Output

    2023

    2023

    2024

    这个题意好理解,就是有一个坑,闰年有2月29日,要特判一下。用这个蔡勒公式,现学现用。。。

    这个题反正写的很不开心,Output Limit Exceeded,(▼へ▼メ),一点不改的再交一遍就过了,可能这个测评机不喜欢我。。。

    关于这个蔡勒公式,百度一下有,其他的,传送门:http://blog.csdn.net/areskris/article/details/8661983

    代码:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int gg(int y,int m,int d){                                //蔡勒公式,看传送门
     4     int iweek=0;
     5         int yy=0,c=0,mm=0,dd=0;
     6         if(m==1||m==2){
     7             c=(y-1)/100;
     8             yy=(y-1)%100;
     9             mm=m+12;
    10             dd=d;
    11         }
    12         else{
    13             c=y/100;
    14             yy=y%100;
    15             mm=m;
    16             dd=d;
    17         }
    18         iweek=yy+yy/4+c/4-2*c+26*(mm+1)/10+dd-1;
    19         iweek=iweek>=0?(iweek%7):(iweek%7+7);
    20         if(iweek==0)iweek=7;
    21         return iweek;
    22 }
    23 int main(){
    24     int t,ans;
    25     int y,m,d;
    26     char k1,k2;
    27     scanf("%d",&t);
    28     while(t--){
    29         scanf("%d%c%d%c%d",&y,&k1,&m,&k2,&d);
    30         ans=gg(y,m,d);                                     //找出来是星期几。
    31         if(m==2&&d==29){                                   //特判2月29,只找闰年的就可以。
    32             for(int i=y+4;i<=9999;i+=4){                   //每4年加一次,题目说了答案不会超过4位数,所以9999。
    33             if((i%4==0&&i%100!=0)||i%400==0){              //判断闰年。
    34             if(gg(i,m,d)==ans){                            //判断一下就可以。
    35                 printf("%d
    ",i);
    36                 break;                                     //因为题意是找最近的一年。
    37             } 
    38             }
    39             }
    40         }
    41         else{
    42         for(int i=y+1;i<=9999;i++){                       
    43             if(gg(i,m,d)==ans){                            //没什么好解释的,大体同上。
    44                 printf("%d
    ",i);
    45                 break;
    46             }
    47         }
    48         }
    49     }
    50     return 0;
    51 }

    我对自己好失望,太菜了,看一个题不会,再看一个题还是不会,写a+b还没有成就感,写稍微难一点的题要改好久才改对。。。

    (;´д`)ゞ加油呗,垃圾。

  • 相关阅读:
    通过path绘制点击区域
    能添加图标的label
    便利的初始化view以及设置tag值
    递归搜寻NSString中重复的文本
    自动移除的通知中心
    BadgeValueView
    SpringCloud的入门学习之Eureka(Eureka的单节点)
    Elasticsearch 6.x版本全文检索学习之分布式特性介绍
    关于window10更新之后,15.5版本虚拟机不能使用的情况:检测更新版本
    RabbitMQ的消息确认ACK机制
  • 原文地址:https://www.cnblogs.com/ZERO-/p/9692983.html
Copyright © 2020-2023  润新知