POJ 3715:计算工作天数

总时间限制: 
1000ms 
内存限制: 
65536kB
描述
小王是一家公司的人力资源部门的经理,现在她想知道谁在公司呆的天数最长。每天员工都有一个进入
公司的日期,和离开公司的日期。如果员工还在公司工作,那么他的离开日期就是当前的日期。编写一
个程序,计算每个员工在公司的天数,并按照天数从大到小排序,如果两个员工的天数相同,则按输入

的先后次序排序。

输入
只有一个测试样例。第一行有一个整数n,表示这组测试数据共有n行。其后n行,每行的每一个是字符串,表示人名,其长度不超过10。后6个是整数,各个值之间
用一个空格隔开。第一个数表示员工加入公司的年份,第二个数表示员工加入公司的月份,第三个数表示员工加入公司的日期。第四个数表示员工离开公司的年份,第五个数表示员工离开公司的月份,每六个数表示员工离开公司的日期。输入的日期不小于1900 1 1 不大于9999 12 31
在我们现在使用的日历中, 闰年被定义为能被4整除的年份,但是能被100整除而不能被400整除的年是例外,它们不是闰年。例如:1700, 1800, 1900 和 2100 不是闰年,而 1600, 2000 和 2400是闰年。

输出
计算每个员工在公司所呆的天数,并按所呆的天数长短进行排序,如果两个员工的天数相同,则按输入顺序排序。
样例输入
3
john 2007 10 1 2007 10 2
abbot 2008 2 21 2008 3 1
alcott 2006 2 20 2006 3 1
样例输出
abbot 10
alcott 10
john 2


好久没做poj,挑一个水题来练练手,大笑,这题主要是细心啊。

这题用的是vector来储存每个人员的工作信息,使用模板算法stable_sort来排序。

计算年的方法是:例如,从1900年1月1日到9999年12月1日的时间,首先计算1900年1月1日到9999年12月31日的天数,然后再减去30天即可。就是先计算入职时间和离职时间到某个时间节点的天数,然后再将它们对减即可。

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int month_1[] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; // 正常年的月份
int month_2[] = {0,31,29,31,30,31,30,31,31,30,31,30,31}; // 闰年的月份
int n, year_in, year_out, day_in, day_out, month_in, month_out;

typedef struct employee{
	string name;
	int days_in_company;
} EMPLOYEE;

vector<EMPLOYEE> employee_vec;

bool is_leap_year(int year){ // 闰年返回1,否则返回0
	if (year%4==0){
		if ( (year%100 == 0) && (year%400 != 0) )
			return false;
		return true;
	}
	return false;
}

int count_days(){
	int days = 0;
	days += (is_leap_year(year_in) ?  month_2[month_in] : month_1[month_in]) - day_in + 1; 
	for (int i = month_in + 1; i < 13; ++i){
		if (is_leap_year(year_in))
			days += month_2[i];
		else
			days += month_1[i];
	}
	for (int i = year_in + 1; i <= year_out; ++i){ 
		if (is_leap_year(i))
			days += 366;
		else
			days += 365;
	}

	days -= (is_leap_year(year_out) ? month_2[month_out] : month_1[month_out]) - day_out;
	for (int i = month_out + 1; i < 13; ++i){
		if (is_leap_year(year_out))
			days -= month_2[i];
		else
			days -= month_1[i];
	}
	return days;
}

int isShorter(const EMPLOYEE &a, const EMPLOYEE &b){
	return a.days_in_company > b.days_in_company;
}

int main(){	
	cin >> n;
	while(n--){
		EMPLOYEE one;
		cin >> one.name;
		cin >> year_in >> month_in >> day_in >> year_out >> month_out >> day_out;
		one.days_in_company = count_days();
		employee_vec.push_back(one);
	}
	stable_sort(employee_vec.begin(), employee_vec.end(), isShorter);
	for (vector<EMPLOYEE>::iterator it = employee_vec.begin(); it != employee_vec.end(); ++it){
		cout << (*it).name << " " << (*it).days_in_company << endl;
	}
	return 0;
}




发布了53 篇原创文章 · 获赞 5 · 访问量 20万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章