初涉时间间隔问题
之前有遇到一道题目是这样的:
问题 G: sake有多少次表白机会
时间限制: 1 Sec 内存限制: 32 MB
提交: 81 解决: 10
[提交][状态][讨论版]
题目描述
sake 要去向女神表白了。但是在哪个时间表白才合适呢?
sake 想了想,觉得这个时间应该符合这个要求:
这个时间的小时H *2500 及分钟 M之和 S 为素数(为什么是素数?因为素数只能被1和她本身整除,而 sake 是NO.1)
符合这个要求的时间我们称之为好时机!
sake 总是在某段时间内的好时机(包括两个时间端点)不断地表白,那么他一共有多少表白的好时机呢?
输入
有许多组测试数据(不少于20000),每组数据包括两行,第一行为开始时间(00:00 - 23:59),第二行为结束时间(0 0:00-23:59)
输出
每行输出对应测试数据sake最多表白的次数
样例输入
00:03
00:13
样例输出
5
得到的解决代码是:(from zhusichao)
1 #include<stdio.h> 2 int main() 3 { 4 int i,j,su[60000],n1,n2,m1,m2,ans,k; 5 char c; 6 for (i=2;i<60000;i++)//su为素数数组 7 su[i]=1; 8 su[0]=0; su[1]=0; 9 for (i=1;i<60000;i++) 10 { 11 if (su[i]==1) 12 for (j=i*2;j<60000;j+=i) 13 su[j]=0; 14 } 15 while (scanf("%d%c%d",&n1,&c,&m1)!=EOF) 16 { 17 ans=0; 18 scanf("%d%c%d",&n2,&c,&m2); 19 while (n1<n2) 20 { 21 while (m1<60) 22 { 23 k=n1*2500+m1; 24 if (su[k]==1) ans++; 25 m1++; 26 } 27 m1=0; 28 n1++; 29 } 30 while (m1<=m2) 31 { 32 k=n1*2500+m1; 33 if (su[k]==1) ans++; 34 m1++; 35 } 36 printf("%d\n",ans); 37 } 38 return 0; 39 }
现遇到一题如下:
问题 G: 赚钱啦
时间限制: 1 Sec 内存限制: 128 MB
提交: 23 解决: 11
[提交][状态][讨论版]
题目描述
淘宝双11刚过,Lintz同学在淘宝上开了一家服装店,从高穷矬变成了高富矬。但是其实不止11月赚了这么多钱,他发现当在月份为素数(2,3,5,7,11)的时候,每天可赚m元,但是一旦到了普通月份,每天只有n元。可是,他只会赚钱,不会算算数,请你们帮帮他吧!
输入
有多组测试数据,请用while(…)读入数据,直到EOF。
每组第一行两个整数m,n,代表素数月与平时月每天赚的数目。
第二行为x,表示接下来有x段时间需要计算。
最后是x行数据,每行包含六个整数Y1,M1,D1,Y2,M2,D2(日期在1000-1-1和2999-12-31),表示起始日期和终止日期(计算时包含这两天的销售额的)。
注意:不考虑历史上时间突变问题(不知道的可以忽略这句话)
输出
输出每段时间段期间所赚得的钱数,每个测试案例输出占一行。
样例输入
3 1
2
2000 1 1 2000 2 29
2000 1 1 2001 4 20
样例输出
118
898
解题思路:
可根据上题套路,从 年份 》 月份 》 日期 的顺序依次往下排
对答案进行累加
其中我遇到了一个问题就是初始的 日期 和截止的 日期 不一样时,会存在 多减 或者 少减 的问题
我的解决方案是:
先讲初始日期赋值为1
然后算到结尾时,无论之前的初始日期为多少
我们只需要在答案基础上加上 1 到初始日期那天所赚钱的钱便可弥补回来(具体钱数按照是否为素数月份考虑)
以下是我的代码:
1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 int k,i,j; 6 int mon[12]={31,28,31,30,31,30,31,31,30,31,30,31}; 7 int mon1[12]={31,29,31,30,31,30,31,31,30,31,30,31}; 8 int y1,y2,m1,m2,d1,d2,kkk,mmm,eee; 9 int m,n,x,res; 10 while(scanf("%d%d",&m,&n)!=EOF) 11 { 12 scanf("%d",&x); 13 while(x--) 14 { 15 scanf("%d%d%d%d%d%d",&y1,&m1,&d1,&y2,&m2,&d2); 16 res=0;kkk=d1;mmm=m1;eee=m2; 17 d1=1; 18 while(y1<y2) 19 { 20 while(m1<=12) 21 { 22 if(y1%4==0 && y1%100!=0 || y1%100==0 && y1%400==0 ) 23 { 24 if(m1==2||m1==3||m1==5||m1==7||m1==11) 25 res+=mon1[m1-1]*m; 26 else 27 res+=mon1[m1-1]*n; 28 } 29 else 30 { 31 if(m1==2||m1==3||m1==5||m1==7||m1==11) 32 res+=mon[m1-1]*m; 33 else 34 res+=mon[m1-1]*n; 35 } 36 m1++; 37 } 38 m1=1; 39 y1++; 40 } 41 while(m1<m2) 42 { 43 if(y1%4==0 && y1%100!=0 || y1%100==0 && y1%400==0 ) 44 { 45 if(m1==2||m1==3||m1==5||m1==7||m1==11) 46 res+=mon1[m1-1]*m; 47 else 48 res+=mon1[m1-1]*n; 49 } 50 else 51 { 52 if(m1==2||m1==3||m1==5||m1==7||m1==11) 53 res+=mon[m1-1]*m; 54 else 55 res+=mon[m1-1]*n; 56 } 57 m1++; 58 } 59 while(d1<=d2) 60 { 61 if(m1==2||m1==3||m1==5||m1==7||m1==11) 62 res+=m; 63 else 64 res+=n; 65 d1++; 66 } 67 d1=kkk; 68 while(d1>1) 69 { 70 if(mmm==2||mmm==3||mmm==5||mmm==7||mmm==11) 71 res-=m; 72 else 73 res-=n; 74 d1--; 75 } 76 printf("%d\n",res); 77 } 78 } 79 return 0; 80 }
后记:
1不是素数= = 当时写的时候忘了
闰年的定义是 当年份是100的倍数时能被400整除或者不是100的倍数时能被4整除
有关时间间隔的题目要这样写( ⊙ o ⊙ )啊!