Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

老是WA..都提交了4~5次了(具体几次不记得了)..什么都试过了..

Posted by __cplusplus at 2008-11-07 17:39:13 on Problem 1015 and last updated at 2008-11-07 17:53:19
唉……所有见得到想得到的数据都过了……但是……
附上源码吧……

#include <iostream>
#include <cstdlib>
#include <string>
#include <bitset>

using namespace std;

const int candidate_count_max = 200;
const int jury_count_max = 20;
const int preference_max = 20 * jury_count_max;
const int preference_min = -20 * jury_count_max;
const int preference_count_max = preference_max-preference_min+1;
const int preference_excursion = -preference_min;

typedef bitset<candidate_count_max+1> name_t;

int v[candidate_count_max+1];
int s[candidate_count_max+1];
int l[candidate_count_max+1];
int r[candidate_count_max+1];
int _f[jury_count_max+1][preference_count_max+1];
name_t _a[jury_count_max+1][preference_count_max+1];

int candidate_count = 0;
int jury_count = 0;

inline int &f(int i, int j)
{ return _f[i][j+preference_excursion]; }
inline name_t &a(int i, int j)
{ return _a[i][j+preference_excursion]; }

inline void reset(void)
{
	for (int i = 0; i <= jury_count; ++i)
		for (int j = preference_min; j <= preference_max; ++j)
		{
			f(i, j) = -1;
			a(i, j) = 0;
		}
	f(0, 0) = 0;
}

inline name_t dynamic(void)
{
	for (int i = 1; i <= jury_count; ++i)
		for (int j = 1; j <= candidate_count; ++j)
		{
			int s = preference_min;
			int t = preference_max;
			if (v[j] > 0)
				t = preference_max - v[j];
			else
				s = preference_min - v[j];
			for (int k = s; k <= t; ++k)
			{
				if (f(i-1, k-v[j]) < 0) continue;
				if (a(i-1, k-v[j]).test(j)) continue;
				if (f(i-1, k-v[j]) + ::s[j] <= f(i, k)) continue;
				f(i, k) = f(i-1, k-v[j]) + ::s[j];
				a(i, k) = a(i-1, k-v[j]);
				a(i, k).set(j);
			}
		}
	for (int i = 0; i <= preference_max; ++i)
	{
		if (f(jury_count, i) >= 0)
		{
			if (f(jury_count, i) > f(jury_count, -i))
				return a(jury_count, i);
			else return a(jury_count, -i);
		}
		else if (f(jury_count, -i) >= 0)
			return a(jury_count, -i);
	}
	return a(0, 0);
}

int main(int argc, char *argv[])
{
	cin >> candidate_count >> jury_count;
	reset();
	int x, y, c = 0;
	while (candidate_count != 0 && jury_count != 0)
	{
		for (int i = 1; i <= candidate_count; ++i)
		{
			cin >> l[i] >> r[i];
			v[i] = l[i] - r[i];
			s[i] = l[i] + r[i];
		}

		name_t list;
		list = dynamic();
		x = y = 0;
		for (int i = 1; i <= candidate_count; ++i)
			if (list[i])
			{
				x += l[i];
				y += r[i];
			}
		cout << "Jury #" << ++c << endl;
		cout << "Best jury has value " << x;
		cout << " for prosecution and value " << y;
		cout << " for defence:" << endl;
		for (int i = 1; i <= candidate_count; ++i)
			if (list[i])
				cout << ' ' << i;
		cout << endl << endl;

		cin >> candidate_count >> jury_count;
		reset();
	}
	return EXIT_SUCCESS;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator