⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 poj3110_堆.cpp

📁 本人最近在acm.pku.edu.cn上通过的程序
💻 CPP
字号:
#include <algorithm>
#include <queue>
using namespace std;

const int MAXN = 50010;

struct Node{
	int d, id;
	Node(int d = 0, int id = 0):d(d), id(id){}
	bool operator < (const Node &a) const{
		return d < a.d;
	}
};

priority_queue<Node> h;

int n, last;
char s[100];
Node t[MAXN];
int dl[MAXN];

inline bool special(int x){
	if (x % 400 == 0) return true;
	if (x % 100 != 0 && x % 4 == 0) return true;
	return false;	
}

const int md[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

int days(int y, int m, int d){
	int ret = 0;
	for (int i = 1600; i < y; i++){
		ret += 365;
		if (special(i)) ret++;
	}
	for (int i = 1; i < m; i++){
		ret += md[i];
		if (i == 2 && special(y)) ret++;
	}
	ret += d;
	return ret;
}

void printDate(const int x){
	int ds = 0, y, m, d;
	for (y = 1600; ds < x; y++){
		ds += 365;
		if (special(y)) ds++;
	}
	y--;
	ds -= 365; if (special(y)) ds--;
	for (m = 1; ds < x; m++){
		ds += md[m];
		if (m == 2 && special(y)) ds++;	
	}
	m--;
	ds -= md[m]; if (m == 2 && special(y)) ds--;
	d = x - ds;
	printf("%0.2d.%0.2d.%0.4d\n", d, m, y);
}

void init(){
	scanf("%d", &n);  last = 0;
	for (int i = 1; i <= n; i++){
		getchar();
		gets(s);		
		int y, m, d;
		scanf("%d.%d.%d", &d, &m, &y);
		t[i] = Node(days(y, m, d), i);
		if (t[i]. d > last) last = t[i].d;
		scanf("%d", &d);
		dl[i] = t[i].d - d;		
	}
}

void solve(){
	int i, j, q, have;	
	sort(t + 1, t + n + 1);
	have = 1;  
	i = n;  
	int td = days(2100,12,31);
	while (i > 0 || !h.empty()){
		if (i > 0 && td == t[i].d){
			h.push(Node(dl[t[i].id], t[i].id));
			i--;
		}
		else if (!h.empty()){
			j = h.top().id;
			h.pop();
			if (td < dl[j]) {
				have = 0;  break;
			} 
		}
		td--;
	}
	if (!have){puts("Impossible"); return;}
	printDate(td + 1);
}

int main(){
	init();
	solve();
	return 0;	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -