在打完一场艰苦的战斗后,将军决定对手下的军官进行奖励,规则如下:将军和每位下属的军官在左、右手各写一个数字,然后这些军官依次排列,将军站在队首,每位军官得到的奖励分别为排在他之前的所有人左手上数字的乘积除以他右手上的数字,结果向下取整,为避免某个军官获得过多的奖励,需要调整军官的队列,请设计程序实现并输出军官的排列,使得可能获取最高奖励的军官获得的奖励最少,同时输出该最小值。
1.1 数据取值范围
获奖军官人数:[1, 1000]
手上的数字:[0, 10000]
1.2 资源要求
运行时间:< 1s;
内存占用:< 32768kB;
1.3 应用场景
l 任务队列管理
是不是这样处理
先找到最大的奖励的那个军官B1
然后将军在队首A 之后找到左值最小的军官B2如果左值为0
则排队为A B2 B1 不然则A B1 其它军官随便排列
我也想学,有人给答案,题主@我一下奥
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int compare(const void *a, const void *b)
{
int x = *(int *)a;
int y = *(int *)b;
return (x > y) - (x < y);
}
int main()
{
// Number of officers
int n;
scanf("%d", &n);
// Numbers written by the general and each officer
int left[n], right[n];
for (int i = 0; i < n; i++)
scanf("%d%d", &left[i], &right[i]);
// Rewards for each officer
int rewards[n];
for (int i = 0; i < n; i++)
{
int reward = 1;
for (int j = 0; j < i; j++)
reward *= left[j];
rewards[i] = floor(reward / right[i]);
}
// Sort rewards in ascending order
qsort(rewards, n, sizeof(int), compare);
// Output rewards and minimum reward
for (int i = 0; i < n; i++)
printf("%d ", rewards[i]);
printf("\n%d\n", rewards[0]);
return 0;
}