• URAL 2048 Histroy(打表+模拟)


    因为年历是400年一个循环节的,所以递推出一年的情况,然后递推处理出一个循环节的情况。对于询问,求一个类似前缀和的东西就好了。

    跑出来和比样例小一,把A和B加一以后交后AC...

    写得时候注意变量的定义。。。不然WA到哭。。。我是以6代表星期5的,1900年是第一年,所以B,A减去1900之前要加一。

    #include<cstdio>
    #include<cstring>
    
    bool isLeapYear(int y)
    {
       if(y%100){
          return !(y&3);
       }
       else {
          return !(y%400);
       }
    }
                   // 1    3     5     7   8    10    12
    int days[] = {-1,31,28,31,30,31,30,31,31,30,31,30,31};
    //6 7 1 2 3 4 5
    int cnt1[7];//1~2月
    int cnt2[7];//2月以后
    int cnt[7];
    
    //1900
    void firstYear()
    {
       int v = 0;
      for(int m = 1; m <= 2; m++) {
          cnt1[v]++;
          v = (v+days[m])%7;
      }
      for(int m = 3; m <= 12; m++) {
          cnt2[v]++;
          v = (v+days[m])%7;
      }
      for(int i = 0; i < 7; i++) {
          cnt[i] = cnt1[i]+cnt2[i];
      }
    }
    
    int cnt400[401][13];
    int cntCur[7];
    
    void circle()
    {
       firstYear();
       int mov = 0;
       int i = 1;//1900
       for(int y = 1900; y < 2300; y++,i++){//1,1 +mov1 1,2 2->last 1
          memset(cntCur,0,sizeof(cntCur));
          if(isLeapYear(y)) {
             for(int i = 0; i < 7; i++)//2月以前不受影响
                cntCur[i] += cnt1[(i-mov+7)%7];
             mov = (mov + 1)%7;//相对上一年
             for(int i = 0; i < 7; i++)
                cntCur[i] += cnt2[(i-mov+7)%7];
    
          }
          else {
             for(int i = 0; i < 7; i++)
                cntCur[i] += cnt[(i-mov+7)%7];
          }
          mov = (mov + 1)%7;//365%7 =1
          for(int j = 0; j < 13; j++){
            cnt400[i][j] = cnt400[i-1][j];
          }
          cnt400[i][cntCur[6]]++;
       }
    }
    
    
    int ans[13];
    //#define local
    int main()
    {
    #ifdef local
        freopen("data.txt","w",stdout);
    #endif // local
       int A,B;
       circle();
       scanf("%d%d",&A,&B);
            B++;A++;
            int a = (A-1-1900)%400;
            int na = (A-1-1900)/400;
            int b = (B-1900)%400;
            int nb = (B-1900)/400;
            for(int i = 0; i < 13; i++){
                ans[i] += (nb-na)*cnt400[400][i] + cnt400[b][i] - cnt400[a][i];
            }
        for(int i = 0; i < 13; i++)
          printf("%d: %d
    ",i,ans[i]);
    
        return 0;
    }
  • 相关阅读:
    ManualResetEvent详解
    MEF搜索范围
    ThreadStart和ParameterizedThreadStart区别
    快速理解C#高级概念(一) Delegate委托
    c# 多线程 --Mutex(互斥锁)
    sql server 得到数据库字典
    遇到的坑:在线用户统计的实现
    asp.net core 使用EF7 Code First 创建数据库,同时使用命令创建数据库
    使用cachemanager做缓存(Session的缓存)
    C# web api返回类型设置为json的两种方法
  • 原文地址:https://www.cnblogs.com/jerryRey/p/4719747.html
Copyright © 2020-2023  润新知