ZOJ
来源:互联网 发布:淘宝上的汝窑茶具 编辑:程序博客网 时间:2024/06/05 01:00
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3950点击打开链接
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 Y1, M1, D1, Y2, M2, D2, 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
42017 04 09 2017 05 092100 02 01 2100 03 019996 02 01 9996 03 012000 01 01 9999 12 31
Sample Output
42931763534
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.
直接模拟就是 方法可能比较麻烦看到大牛的方法 也可以用三维数组记录从起始点开始每一天的9的个数打表 这里就不贴了
#include <bits/stdc++.h>using namespace std;int sumr=66;int sump=65;int ans=0;int year[10000];int yearsum[10000];void debug(){ cout << ans << endl;}int judgerp(int x){ if(x%400==0) return 1; if(x%4==0&&x%100!=0) return 1; return 0;}int cnt(int y1,int y2,int m1,int m2,int d1,int d2){ ans=0; ans+=(yearsum[y2-1]-yearsum[y1-1]); //debug(); for(int i=1;i<m1;i++) { if(i==2&&!judgerp(y1)) ans-=2; else if(i==9) ans-=33; else ans-=3; } if(d1>9&&d1<=19) { ans-=1; } else if(d1>19&&d1<=29) { ans-=2; } else if(d1>29) { ans-=3; } if(m1==9) ans-=d1-1; for(int i=1;i<m2;i++) { if(i==2&&!judgerp(y2)) ans+=2; else if(i==9) ans+=33; else ans+=3; } if(d2>=9&&d2<19) { ans+=1; } else if(d2>=19&&d2<29) { ans+=2; } else if(d2>=29) { ans+=3; } if(m2==9) ans+=d2; int day=0; for(int i=1;i<m1;i++) { if(i==1||i==3||i==5||i==7||i==8||i==10||i==12) day+=31; else if(i==2) { if(!judgerp(y1)) day+=28; else day+=29; } else day+=30; } day+=d1-1; int num=year[y1]; ans-=(day*num); day=0; for(int i=1;i<m2;i++) { if(i==1||i==3||i==5||i==7||i==8||i==10||i==12) day+=31; else if(i==2) { if(!judgerp(y2)) day+=28; else day+=29; } else day+=30; } day+=d2; num=year[y2]; ans+=(day*num); return ans;}int main(){ for(int i=2000;i<10000;i++) { int mid=i; int num=0; while(mid!=0) { if((mid%10)==9) { num++; } mid/=10; } year[i]=num; } int ansans=0; for(int i=2000;i<10000;i++) { if(judgerp(i)) ansans+=sumr; else ansans+=sump; int num=year[i]; if(judgerp(i)) ansans+=(366*num); else ansans+=(365*num); yearsum[i]=ansans; } int nn=0; scanf("%d",&nn); for(int j=0;j<nn;j++) { int y1,y2,m1,m2,d1,d2; scanf("%d%d%d%d%d%d",&y1,&m1,&d1,&y2,&m2,&d2); if(y1>y2||(y1==y2&&m1>m2)||(y1==y2&&m1==m2&&d1>d2)) { swap(y1,y2); swap(m1,m2); swap(d1,d2); } printf("%d\n",cnt(y1,y2,m1,m2,d1,d2)); }}
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- 初入c++(七)运算符的重载+、-、*、/、[]、自加++的重载
- 欢迎使用CSDN-markdown编辑器
- 深入研究Struts2(一)---Struts2是什么?它的工作原理是什么?
- JSP九个内置对象
- MySQL 事务
- ZOJ
- Android—多媒体(音频播放)
- 7/14 CCF YOCSEF学术报告会:区块链技术
- Opencv
- ListView加载不同的条目
- 32.最长的合法括号匹配
- 复制多级文件夹
- 从 1-15中,随机出来5个数,不能重复的
- 利用vs2015编写C语言遇见的错误集