ZOJ
来源:互联网 发布:深圳入学积分怎么算法 编辑:程序博客网 时间:2024/06/11 09:17
大模拟
大体思路:
给定 y1:m1:d1 ~ y2:m2:d2,
可以分为三个阶段,分别计算:
① y1+1 ~ y2-1 这其中的整年份可以直接算出来:打表预处理
② y1:m1:d1 ~ y1年年末; 多少个月,多少天,分别考虑
③ y2年年初 ~ y2:m2:d2; ==
闰年的关系处理清楚就行了;
#include<iostream>#include<algorithm>#include<cstdio>#include<cstdlib>#include<cstring>#include<string>#include<cmath>#include<set>#include<queue>#include<stack>#include<map>#define PI acos(-1.0)#define in freopen("in.txt", "r", stdin)#define out freopen("out.txt", "w", stdout)#define kuaidian ios::sync_with_stdio(0);using namespace std;typedef long long ll;typedef unsigned long long ull;const int maxn = 100 + 7, maxd = 1e8;const ll mod = 1e9 + 7;const int INF = 0x7f7f7f7f;int n1[15] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};int n2[15] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};int sum[10000];bool is_run(int n) { if( (n % 4 == 0 && n % 100 != 0) || (n % 400 == 0)) return true; else return false;}int num_(int n) { int cnt = 0; while(n) { int t = n % 10; if(t == 9) cnt++; n /= 10; } return cnt;}void init() { sum[1999] = 0; for (int i = 2000; i <= 9999; i ++) { if (is_run(i)) { sum[i] = sum[i-1] + ( 36 + 366*num_(i) + 30); } else { sum[i] = sum[i-1] + (35 + 365*num_(i) + 30); } }}int main() { int n; int y1, m1, d1, y2, m2, d2; init(); scanf("%d", &n); for(int ii = 0; ii < n; ++ii) { int ans = 0; scanf("%d %d %d %d %d %d", &y1, &m1, &d1, &y2, &m2, &d2); ans += max(0, (sum[y2-1] - sum[y1])); int tt1 = 0, tt2 = 0; if(is_run(y1)) { int t1 = num_(y1); int t2 = 0; for(int i = 1; i < m1; ++i) t2 += (n2[i]); int t3 = (366 - t2 - d1+1) * t1; // 年 贡献 int t4 = (12 - m1)*3; int t5 = 0; for(int i = d1; i <= 30; ++i) { // 日 贡献 if(i % 10 == 9) t5 ++; } int t6 = 0; if(m1 == 9) { t6 += (30 - d1 + 1); } else if(m1 < 9) { t6 += (30); } tt1 = (t3 + t4+t5 + t6); } else { int t1 = num_(y1); int t2 = 0; for(int i = 1; i < m1; ++i) t2 += (n1[i]); int t3 = (365 - t2 - d1+1) * t1; // 年 贡献 int t4 = (12 - m1)*3; int t5 = 0; for(int i = d1; i <= 30; ++i) { // 日 贡献 if(i % 10 == 9) t5 ++; } if(m1 <= 2) t5--; int t6 = 0; if(m1 == 9) { t6 += (30 - d1 + 1); // 月 贡献 } else if(m1 < 9) { t6 += (30); } tt1 = (t3 + t4+t5 + t6); } if(is_run(y2)) { int t1 = num_(y2); int t2 = 0; for(int i = 1; i < m2; ++i) t2 += (n2[i]); int t3 = (t2 + d2) * t1; // 年 int t4 = (m2 - 1) * 3; int t5 = 0; for(int i = 1; i <= d2; ++i) if(i % 10 == 9) t5 ++; int t6 = 0; if(m2 > 9) { t6 += 30; } else if(m2 == 9) { t6 += (d2); } tt2 = (t3 + t4+t5 + t6); } else { int t1 = num_(y2); int t2 = 0; for(int i = 1; i < m2; ++i) t2 += (n1[i]); int t3 = (t2 + d2) * t1; // 年 int t4 = (m2 - 1) * 3; int t5 = 0; for(int i = 1; i <= d2; ++i) if(i % 10 == 9) t5 ++; if(m2 > 2) { t5--; } int t6 = 0; if(m2 > 9) { t6 += 30; } else if(m2 == 9) { t6 += (d2); } tt2 = (t3 + t4+t5 + t6); } if(y1 == y2) { int tt3 = 0; if(is_run(y1)) { tt3 = ( 36 + 366*num_(y1) + 30); } else tt3 = ( 35 + 365*num_(y1) + 30); ans += (tt2 + tt1 - tt3); } else { ans += (tt1 + tt2); } printf("%d\n", ans); } return 0;}
阅读全文
1 0
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- Android应用开发—setResult()的调用时机
- .dll文件讲解,及其调用
- RPM包管理基础和源码编译基础
- 自定义view轮播
- NodeJS之域名解析器实现
- ZOJ
- javaScript 小结
- LeetCode:Maximum Length of Repeated Subarray
- 【Web前端学习笔记】EasyUI、JQuery表单验证
- Java模板方法模式中的HookMethod实现
- Android里面常用的Drawable的使用
- Linux进程地址空间管理
- HDU 5982Relic Discovery
- python中的os.listdir()方法