TOJ 1609 Moo University - Team Tryouts

題目鏈接:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1609

真是好題啊。。。關於題解可以參考這三個地址:

POJ 2008 Moo University - Team Tryouts 牛題


poj 2008 Moo University - Team Tryouts 解題報告2


March 2004 Green problems with analysis

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define mp make_pair
#define X first
#define Y second
#define MEMSET(a, b) memset(a, b, sizeof(a))
using namespace std;

typedef unsigned int ui;
typedef long long ll;
typedef unsigned long long ull;
typedef pair pii;
typedef vector vi;
typedef vi::iterator vi_it;
typedef map mii;
typedef priority_queue pqi;
typedef priority_queue, greater > rpqi;
typedef priority_queue pqp;
typedef priority_queue, greater > rpqp;

const int MAX_N = 1000 + 2;

typedef struct cow
{
	int w;
	int h;
	int k;
} *pcow;

cow cw[MAX_N];
pcow sort_w[MAX_N];
pcow sort_k[MAX_N];

bool cmp_w(const pcow &c1, const pcow &c2)
{
	return c1->w < c2->w;
}

bool cmp_k(const pcow &c1, const pcow &c2)
{
	return c1->k < c2->k;
}

struct rcmp
{
	bool operator () (const pcow &c1, const pcow &c2) {
		return c1->w > c2->w;
	}
};

int main(int argc, char *argv[])
{
//	freopen("D:\\in.txt", "r", stdin);
	int n, a, b, c, i, j;
	cin >> n >> a >> b >> c;
	for (i = 0; i < n; ++i) {
		cin >> cw[i].h >> cw[i].w;
		cw[i].k = a * cw[i].h + b * cw[i].w;
		sort_w[i] = cw + i;
		sort_k[i] = cw + i;
	}
	sort(sort_w, sort_w + n, cmp_w);
	sort(sort_k, sort_k + n, cmp_k);
	sort_w[n] = new cow();
	sort_w[n]->w = 0;
	priority_queue, rcmp> q;
	int ans = 0;
	for (i = 0; i < n; ++i) {
		int pos = 0, cnt = 0;
		while (!q.empty()) {
			q.pop();
		}
		for (j = 0; j < n && sort_w[j]->w <= cw[i].w; ++j) {
			if (sort_w[j]->w == sort_w[j + 1]->w) {
				continue;
			}
			int lmt = a * cw[i].h + b * sort_w[j]->w + c;
			while (pos < n && sort_k[pos]->k <= lmt) {
				if (sort_k[pos]->h >= cw[i].h && sort_k[pos]->w >= sort_w[j]->w) {
					q.push(sort_k[pos]);
					++cnt;
				}
				++pos;
			}
			if (cnt > ans) {
				ans = cnt;
			}
			while (!q.empty() && q.top()->w == sort_w[j]->w) {
				q.pop();
				--cnt;
			}
		}
	}
	
	cout << ans << endl;
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章