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;
}