您的位置:首页 > 其它

解题报告:人人都有极客精神

2015-07-18 18:09 375 查看
人人公司是一家极为鼓励极客精神的公司,当有重要的项目需要上线但又时间太紧,甚至需要当天上线的时候,往往会挂起海盗旗开启电子日期显示,让大家可以在对时间有更明确的感知的情况下,同心协力搞定重要的项目。海盗旗下方的电子屏显示的日期形式为 YYYYMMDD (年份占 4 位、月份占 2 位、天数占 2 位)。
日期电子屏幕上每个数字对应的显示如下图:


从上图可以得知每个数字对应的笔画数,比如 2 的笔画数是 5,8 的笔画数是 7,等等。人人员工小明看到了项目的启动日期 d,但是项目的结束日期没看清楚,只知道电子屏幕上项目结束日期所需的笔画数为 m,你能帮小明算出来项目执行所用的时间天数么?


输入格式

输入数据有多组。第一行输入一个整数 T (1 ≤ T ≤ 20),表示一共有 T 组数据。 接下来每组数据 2 行,共 T * 2 行。每组第一行输入一个长度为 8 的仅包含数字的字符串 d,表示项目的启动日期,形式为 YYYYMMDD。每组第二行输入一个非负整数 m (0 ≤ m ≤ 100),表示电子屏幕上项目结束日期所需的笔画数。输入日期保证合法。


输出格式

一共输出 T 行,每行一个整数,表示该组数据对应的项目执行所用的时间天数。如果最近的符合要求的结束日期超过 2999 年 12 月 31 日或无解则输出 -1,否则输出符合要求的最小的解。


样例1


输入:

2
20150718
30
29991231
38


输出:

85
-1

做完题时已经结束了,所有不知道能不能ac了


#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
int main(){
freopen("d://uva_in.txt","r",stdin);
int n;
scanf("%d",&n);
while(n--){
int arrayk[10]={6,2,5,5,4,5,6,3,7,6};
int theTime;
scanf("%d",&theTime);
int kv;
scanf("%d",&kv);

int year=theTime/10000;
int month=theTime/100%100;
int day=theTime%100;
int currentNum=0;
for(int i=0;i<8;i++){
currentNum+=arrayk[theTime%10];
theTime/=10;
}
int result=currentNum;
long long res=-1;
bool flag=false;
for(int z=year+1;z<=2999;z++){
if(flag)break;
int j=month+1;
if(z!=year+1)
j=2;
int endI=0;
for(;j<=12;j++){
if(flag)break;
if(j==1||j==3||j==5||j==7||j==8||j==10||j==12)
endI=31;
else if(j==4||j==6||j==9||j==11)
endI=31;
else{
if(z%4==0)
endI=28;
else
endI=29;
}
int i=day+1;
if(j!=month+1)
i=2;
for(;i<=endI;i++){
result=result+arrayk[i%10]+arrayk[i/10%10]-arrayk[(i-1)/10%10]-arrayk[(i-1)%10];
if(result==kv){
flag=true;
break;
}
res++;
}result=result+arrayk[0]+arrayk[1]-arrayk[(endI)/10%10]-arrayk[(endI)%10];//日变成01
result=result+arrayk[j%10]+arrayk[j/10%10]-arrayk[(j-1)/10%10]-arrayk[(j-1)%10];
if(result==kv){
flag=true;
break;
}
res++;
}
result=result+arrayk[0]+arrayk[1]-arrayk[(endI)/10%10]-arrayk[(endI)%10];//日变成01
result=result+arrayk[0]+arrayk[1]-arrayk[(12)/10%10]-arrayk[(12)%10];//月变成01
if(result==kv){
flag=true;
break;
}
result=result+arrayk[z/100%10]+arrayk[z/10%10]+arrayk[z%10]-arrayk[(j-1)/10%10]-arrayk[(j-1)%10]-arrayk[(j-1)/100%10];
res++;
}
//345908
printf("%lld\n",res);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: