ZOJ 17届校赛 How Many Nines

Posted Annetree的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZOJ 17届校赛 How Many Nines相关的知识,希望对你有一定的参考价值。

If we represent a date in the format YYYY-MM-DD (for example, 2017-04-09), do you know how many 9s will appear in all the dates between Y1-M1-D1 and Y2-M2-D2(both inclusive)?

Note that you should take leap years into consideration. A leap year is a year which can be divided by 400 or can be divided by 4 but can‘t be divided by 100.

Input

The first line of the input is an integer T (1 ≤ T ≤ 105), indicating the number of test cases. Then T test cases follow. For each test case:

The first and only line contains six integers Y1M1D1Y2M2D2, their meanings are described above.

It‘s guaranteed that Y1-M1-D1 is not larger than Y2-M2-D2. Both Y1-M1-D1 and Y2-M2-D2 are between 2000-01-01 and 9999-12-31, and both dates are valid.

We kindly remind you that this problem contains large I/O file, so it‘s recommended to use a faster I/O method. For example, you can use scanf/printf instead of cin/cout in C++.

Output

For each test case, you should output one line containing one integer, indicating the answer of this test case.

Sample Input

4
2017 04 09 2017 05 09
2100 02 01 2100 03 01
9996 02 01 9996 03 01
2000 01 01 9999 12 31

Sample Output

4
2
93
1763534

Hint

For the first test case, four 9s appear in all the dates between 2017-04-09 and 2017-05-09. They are: 2017-04-09 (one 9), 2017-04-19 (one 9), 2017-04-29 (one 9), and 2017-05-09 (one 9).

For the second test case, as year 2100 is not a leap year, only two 9s appear in all the dates between 2100-02-01 and 2100-03-01. They are: 2017-02-09 (one 9) and 2017-02-19 (one 9).

For the third test case, at least three 9s appear in each date between 9996-02-01 and 9996-03-01. Also, there are three additional nines, namely 9996-02-09 (one 9), 9996-02-19 (one 9) and 9996-02-29 (one 9). So the answer is 3 × 30 + 3 = 93.

一开始年份一年年搜TLE了,然后开个数组记录一下不用特判的年份就过了

  1 #include <iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<stack>
  6 #include<map>
  7 #include<set>
  8 #include<queue>
  9 #include<string>
 10 #include<vector>
 11 using namespace std;
 12 
 13 int y1,y2,m1,m2,d1,d2;
 14 long long res;
 15 int day[2][13]={0,31,28,31,30,31,30,31,31,30,31,30,31,
 16                 0,31,29,31,30,31,30,31,31,30,31,30,31};
 17 
 18 //判断年份有几个9
 19 int f(int year)
 20 {
 21     int a;
 22     int sum=0;
 23     for(int i=1;i<=4;i++)
 24     {
 25         a=year%10;
 26         if(a==9)
 27             sum++;
 28         year/=10;
 29     }
 30     return sum;
 31 }
 32 
 33 long long y[10000];
 34 
 35 int main()
 36 {
 37     int T,i,flag_r,ynine;
 38     long long temp;
 39     y[1999]=0;
 40     for(i=2000;i<=9999;i++)
 41     {
 42         //如果是闰年
 43         if((i%400==0)||(i%4==0&&i%100!=0))
 44         {
 45             temp=f(i)*366/**/+30/**/+12*3;
 46         }
 47         //如果不是闰年
 48         else
 49         {
 50             temp=f(i)*365/**/+30/**/+12*3-1;
 51         }
 52         y[i]=y[i-1]+temp;
 53     }
 54     while(~scanf("%d",&T))
 55     {
 56         while(T--)
 57         {
 58             scanf("%d%d%d%d%d%d",&y1,&m1,&d1,&y2,&m2,&d2);
 59             res=0;
 60             if(y1!=y2)//不同年份
 61             {
 62                 //特判y1年
 63                 if((y1%400==0)||(y1%4==0&&y1%100!=0))
 64                     flag_r=1;
 65                 else
 66                     flag_r=0;
 67                 ynine=f(y1);
 68                 //特判m1月
 69                 for(i=d1;i<=day[flag_r][m1];i++)
 70                 {
 71                     res+=ynine;//
 72                     if(m1==9)
 73                         res++;//
 74                     if(i%10==9)
 75                         res++;//
 76                 }
 77                 //从m1+1月到12月
 78                 for(i=m1+1;i<=12;i++)
 79                 {
 80                     if(i==2)
 81                     {
 82                         if(flag_r==1)
 83                           res+=3;
 84                         else
 85                           res+=2;
 86                     }
 87                     else
 88                         res+=3;
 89                     /**/
 90                     if(i!=9)
 91                         res+=ynine*day[flag_r][i]/**/+0/**/;
 92                     else
 93                         res+=ynine*day[flag_r][i]+30;
 94                 }
 95                 //
 96                 //判断从y1+1到y2-1年
 97                 res+=y[y2-1]-y[y1];
 98                 //特判y2
 99                 if((y2%400==0)||(y2%4==0&&y2%100!=0))
100                     flag_r=1;
101                 else
102                     flag_r=0;
103                 ynine=f(y2);
104                 //从1月到m2-1月
105                 for(i=1;i<=m2-1;i++)
106                 {
107                     if(i==2)
108                     {
109                         if(flag_r==1)
110                           res+=3;
111                         else
112                           res+=2;
113                     }
114                     else
115                         res+=3;
116                     if(i!=9)
117                         res+=ynine*day[flag_r][i]+0;
118                     else
119                         res+=ynine*day[flag_r][i]+30;
120                 }
121                 //特判m2月
122                 for(i=1;i<=d2;i++)
123                 {
124                     res+=ynine;
125                     if(m2==9)
126                         res++;
127                     if(i%10==9)
128                         res++;
129                 }
130             }
131             else if(m1!=m2)//同年不同月
132             {
133                 if((y1%400==0)||(y1%4==0&&y1%100!=0))
134                     flag_r=1;
135                 else
136                     flag_r=0;
137                 ynine=f(y1);
138                 //特判m1月
139                 for(i=d1;i<=day[flag_r][m1];i++)
140                 {
141                     res+=ynine;
142                     if(m1==9)
143                         res++;
144                     if(i%10==9)
145                         res++;
146                 }
147                 //从m1+1月到m2-1月
148                 for(i=m1+1;i<=m2-1;i++)
149                 {
150                     if(i==2)
151                     {
152                         if(flag_r==1)
153                           res+=3;
154                         else
155                           res+=2;
156                     }
157                     else
158                         res+=3;
159                     if(i!=9)
160                         res+=ynine*day[flag_r][i]+0;
161                     else
162                         res+=ynine*day[flag_r][i]+30;
163                 }
164                 //特判m2月
165                 for(i=1;i<=d2;i++)
166                 {
167                     res+=ynine;
168                     if(m2==9)
169                         res++;
170                     if(i%10==9)
171                         res++;
172                 }
173             }
174             else//同年同月
175             {
176                 if((y1%400==0)||(y1%4==0&&y1%100!=0))
177                     flag_r=1;
178                 else
179                     flag_r=0;
180                 ynine=f(y1);
181                 for(i=d1;i<=d2;i++)
182                 {
183                     if(m1==9)
184                         res+=f(y1)+1;
185                     else
186                         res+=f(y1);
187                     if(i%10==9)
188                         res++;
189                 }
190             }
191             printf("%lld\n",res);
192         }
193     }
194     return 0;
195 }

 

以上是关于ZOJ 17届校赛 How Many Nines的主要内容,如果未能解决你的问题,请参考以下文章

ZOJ 3950 How Many Nines

zoj 3950 how many nines

ZOJ 3950 - How Many Nines

ZOJ 17届校赛 Knuth-Morris-Pratt Algorithm

[省赛训练]How many nines

zoj——3557 How Many Sets II