zcmu-G 手游大佬(模拟,计算两个日期相差多少天)

题目链接 

Input

输入的第一行是一个正整数N(N≤1000),表示冰弦总共打算研究N位大佬。
接下来一共N行,每一行描述了一位天梯上的大佬信息。
每一行,首先是一个格式为yyyy-mm-dd的日期,表示该玩家的注册时间,然后是两个整数M(0≤M≤107)和T(0<T≤107),分别表示该玩家的总充值数(单位:元)和总在线时长(单位:分钟)。
保证玩家的注册时间是一个合法的日期,不晚于2018-04-22,且不早于2000-01-01。
保证玩家的平均每日在线时长不超过24小时。

Output

对于输入的每一行,输出一行答案。

  • 如果该玩家是欧皇,则输出O
  • 如果该玩家是肝帝但不是壕神,则输出G
  • 如果该玩家是壕神但不是肝帝,则输出H
  • 如果该玩家既是肝帝又是壕神,则输出GH

这是一道模拟到地老天荒的题,题目不难但是容易漏的点很多很多,2018不是闰年!!,被坑惨了,还是很考验心细和耐心的。这里把计算天数的算法提出来了,方便以后取用。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <cmath>
using namespace std;

struct Date
{
    int y;//year
    int m;//month
    int d;//day in month
};
bool isLeap(int y)//判断是否是闰年
{
    return y%4==0&&y%100!=0||y%400==0;//真返回为1,假为0
}
int daysOfMonth(int y,int m)
{
    int day[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    if(m!=2)
        return day[m-1];
    else
        return 28+isLeap(y);
}
int daysOfDate(Date d)//计算一共的天数
{
    int days=d.d;
    for(int y=1;y<d.y;y++)//计算年
        days+=365+isLeap(y);
    for(int m=1;m<d.m;m++)//计算月
        days+=daysOfMonth(d.y,m);
    //days+=d.d;
    return days;
}
int main()
{
    int n,money,time,f_g,f_h;
    scanf("%d",&n);
    while(n--)
    {
        Date d,d2;
        f_g = f_h = 0;
        scanf("%d-%d-%d %d %d",&d.y,&d.m,&d.d,&money,&time);
        d2.y = 2018;
        d2.m = 4;
        d2.d = 22;
        int day1 = daysOfDate(d);
        int day2 = daysOfDate(d2);
        int day = day2 - day1 + 1;
        //printf("day:  %d\n",day);
        double avg_money = money / (day * 1.0);
        double avg_time = time / (day * 60.0);
        
        if(avg_money >= 100)
            f_h = 1;
        if(avg_time >= 12)
            f_g = 1;
        if(f_g == 1 && f_h ==1)
            printf("GH\n");
        else if(f_h == 1 && f_g == 0)
            printf("H\n");
        else if(f_h == 0 && f_g == 1)
            printf("G\n");
        else if(f_h == 0 && f_g == 0)
            printf("O\n");
        
    }
    
    return 0;
}

猜你喜欢

转载自blog.csdn.net/hzyhfxt/article/details/81709649