初涉时间间隔问题

之前有遇到一道题目是这样的:

问题 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 ⊙ )啊!

posted @ 2013-12-18 01:03  Jeremy Wu  阅读(435)  评论(0编辑  收藏  举报