人人都有极客精神
http://www.jisuanke.com/minicourse/59/438
人人公司是一家極為鼓勵(lì)極客精神的公司,當(dāng)有重要的項(xiàng)目需要上線但又時(shí)間太緊,甚至需要當(dāng)天上線的時(shí)候,往往會(huì)掛起海盜旗開(kāi)啟電子日期顯示,讓大家可以在對(duì)時(shí)間有更明確的感知的情況下,同心協(xié)力搞定重要的項(xiàng)目。海盜旗下方的電子屏顯示的日期形式為 YYYYMMDD (年份占 4 位、月份占 2 位、天數(shù)占 2 位)。
日期電子屏幕上每個(gè)數(shù)字對(duì)應(yīng)的顯示如下圖:
從上圖可以得知每個(gè)數(shù)字對(duì)應(yīng)的筆畫數(shù),比如 2 的筆畫數(shù)是 5,8 的筆畫數(shù)是 7,等等。人人員工小明看到了項(xiàng)目的啟動(dòng)日期 d,但是項(xiàng)目的結(jié)束日期沒(méi)看清楚,只知道電子屏幕上項(xiàng)目結(jié)束日期所需的筆畫數(shù)為 m,你能幫小明算出來(lái)項(xiàng)目執(zhí)行所用的時(shí)間天數(shù)么?
輸入格式
輸入數(shù)據(jù)有多組。第一行輸入一個(gè)整數(shù) T (1 ≤ T ≤ 20),表示一共有 T 組數(shù)據(jù)。
接下來(lái)每組數(shù)據(jù) 2 行,共 T * 2 行。每組第一行輸入一個(gè)長(zhǎng)度為 8 的僅包含數(shù)字的字符串 d,表示項(xiàng)目的啟動(dòng)日期,形式為 YYYYMMDD。每組第二行輸入一個(gè)非負(fù)整數(shù) m (0 ≤ m ≤ 100),表示電子屏幕上項(xiàng)目結(jié)束日期所需的筆畫數(shù)。輸入日期保證合法。
輸出格式
一共輸出 T 行,每行一個(gè)整數(shù),表示該組數(shù)據(jù)對(duì)應(yīng)的項(xiàng)目執(zhí)行所用的時(shí)間天數(shù)。如果最近的符合要求的結(jié)束日期超過(guò) 2999 年 12 月 31 日或無(wú)解則輸出 -1,否則輸出符合要求的最小的解。
樣例1
輸入:
2 20150718 30 29991231 38輸出:
85 -1http://paste.ubuntu.com/11897447/
結(jié)束日期肯定比開(kāi)始日期晚,程序又讓你計(jì)算持續(xù)天數(shù),所以ans++,筆畫數(shù)控制程序結(jié)束
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; typedef long long LL; int year[3000], month2[13], day[40]; int s[10] = {6, 2, 5, 5, 4, 5, 6, 3, 7, 6}; // 存第幾個(gè)數(shù)需要幾筆畫數(shù) int month1[2][13] = {0,31,28,31,30,31,30,31,31,30,31,30,31,0,31,29,31,30,31,30,31,31,30,31,30,31}; // month[0]存不是閏年當(dāng)前月份天數(shù) void init () {for (int i=0; i<40; i++)day[i] = s[i%10] + s[i/10]; // 第幾天所需筆畫數(shù),第一天是0和1所需筆畫數(shù)之和for (int i=0; i<13; i++)month2[i] = s[i%10] + s[i/10]; // 第幾月所需筆畫數(shù),12月是1和2所需筆畫數(shù)之和memset(year, 0, sizeof(year));for (int i=0; i<3000; i++){int m = i;for (int j=0; j<4; j++){year[i] += s[m%10]; // 第幾年所需筆畫數(shù)2015年是數(shù)字2,0,1,5所需筆畫數(shù)之和m /= 10; }} } int main () {init();int t, y, m, d, num, ans;scanf ("%d", &t);while (t --){int flag = 0;ans = 0;scanf ("%4d%2d%2d", &y, &m, &d);if (y%400==0 || (y%4==0)&&(y%100!=0)) // 是否閏年flag = 1; scanf ("%d", &num);while (true){int nu = year[y] + month2[m] + day[d]; // 當(dāng)前所到日期所需筆畫數(shù)if (nu == num) // 相等結(jié)束whilebreak;if (y==2999 && m==12 && d==31){ans = -1; break;}d ++; // 每次d+1,ans+1,當(dāng)加到日期筆畫數(shù)和輸入相同時(shí)結(jié)束whileans ++;if (month1[flag][m] < d) {d -= month1[flag][m]; // 月份< d時(shí),天數(shù)從0開(kāi)始下月計(jì)算,月份m+1m ++;} if (m > 12) // 月份大于12,下一年開(kāi)始計(jì){m -= 12;y ++;if (y%400==0 || (y%4==0)&&(y%100!=0))flag = 1;elseflag = 0;}}printf ("%d\n", ans); // 輸出天數(shù)}return 0; }
?
轉(zhuǎn)載于:https://www.cnblogs.com/Tinamei/p/4658133.html
總結(jié)
- 上一篇: ios 简书 获取通讯录信息_ios 获
- 下一篇: 修改虚拟机设置过游戏检测