zoukankan      html  css  js  c++  java
  • 初涉时间间隔问题

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

    问题 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
    ",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
    ",res);
    77         }
    78     }
    79     return 0;
    80 }

    后记:

    1不是素数= = 当时写的时候忘了

    闰年的定义是 当年份是100的倍数时能被400整除或者不是100的倍数时能被4整除

    有关时间间隔的题目要这样写( ⊙ o ⊙ )啊!

  • 相关阅读:
    Swift-基础语法之变量&常量&元组
    Swift
    安装MySQL
    LNMP 简介
    LNMP
    Django 定义数据模型
    Django 添加应用
    Django 创建第一个项目
    Django 安装
    Django 简介
  • 原文地址:https://www.cnblogs.com/wushuaiyi/p/3479576.html
Copyright © 2011-2022 走看看