HZOI-256:国王游戏

题目描述

​ 恰逢 H 国国庆,国王邀请 n位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这 n 位大臣排成一排,国王站在队伍的最前面。排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。

​ 国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。


输入

​ 第一行包含一个整数 n,表示大臣的人数。

​ 第二行包含两个整数 a 和 b,之间用一个空格隔开,分别表示国王左手和右手上的整数。(均小于 10000)

​ 接下来 n 行,每行包含两个整数 a 和 b,之间用一个空格隔开,分别表示每个大臣左手和右手上的整数。(均小于 10000)

输出

​ 输出一个整数,表示重新排列后的队伍中获奖赏最多的大臣所获得的金币数。


样例输入
3
1 1
2 3
7 4
4 6
样例输出
2

数据规模与约定

​ 时间限制:1 s

​ 内存限制:256 M

​ 100% 的数据保证 1≤n≤1000

#include 
#include 
#define MAX 4005
int ind[1005] = { 0 };
int p[1005] = { 0 };
int q[1005] = { 0 };
void read(int* p, int n) {
	int i = 0;
	while (n > 0) {
		p[i] = n % 10;
		n /= 10;
	}
	return;
}

int com(int* p, int* q) {
	for (int i = MAX - 1; i >= 0; i--) {
		if (p[i] == q[i]) continue;
		if (p[i] < q[i]) return -1;
		if (p[i] > q[i]) return 1;
	}
	return 0;
}

void merge_sort(int* ind, int l, int n) {
	if (n - l <= 1) return;
	int mid = (l + n) / 2;
	merge_sort(ind, l, mid);
	merge_sort(ind, mid, n);
	int* temp = (int*)malloc(sizeof(int) * (n - l));
	int p1 = l, p2 = mid, k = 0;
	while (p1 < mid || p2 < n) {
		if (p2 == n || (p1 < mid && p[ind[p1]] * q[ind[p1]] <= p[ind[p2]] * q[ind[p2]])) {
			temp[k++] = ind[p1++];
		}
		else temp[k++] = ind[p2++];
	}
	for (int i = l; i < n; i++) ind[i] = temp[i - l];
	free(temp);
	return;
}

void mul(int* p, int q) {
	for (int i = 0; i < MAX; i++) p[i] = p[i] * q;
	int t = 0;
	for (int i = 0; i < MAX; i++) {
		int c = p[i] + t;
		if (c > 10) {
			t = c / 10;
			p[i] =c % 10;
		}
		else {
			p[i] = c;
			t = 0;
		}
	}
	return;
}

void di_(int* p, int q) {
	int c = 0;
	for (int i = MAX - 1; i >= 0; i--) {
		int n = c * 10 + p[i];
		p[i] = n / q;
		c = n % q;
	}
	return;
}

void cpy(int* p, int* q) {
	for (int i = 0; i < MAX; i++) p[i] = q[i];
	return;
}

void output(int* p) {
	for (int i = MAX - 1, j = 0; i >= 0; i--) {
		if (j == 0 && p[i] == 0) continue;
		printf("%d", p[i]);
		j = 1;
	}
	return;
}

int main() {
	int n;
	scanf("%d\n", &n);
	for (int i = 0; i <= n; i++) {
		scanf("%d %d\n", &p[i], &q[i]);
		ind[i] = i;
	}
	merge_sort(ind, 1, n + 1);
	int ans[MAX] = { 0 };
	int temp[MAX] = { 0 };
	read(ans, p[0]);
	for (int i = 1; i <= n; i++) {
		int t[MAX] = { 0 };
		cpy(t, ans);
		di_(t, q[ind[i]]);
		if (com(t, temp) == 1) {
			cpy(temp, t);
		}
		mul(ans, p[ind[i]]);
	}
	output(temp);
	return 0;
}

你可能感兴趣的:(算法题,算法)