//选秀节目打分,分为专家评委和大众评委,score[] 数组里面存储每个评委打的分数,
//judge_type[] 里存储与 score[] 数组对应的评委类别,judge_type[i] == 1,
//表示专家评委,judge_type[i] == 2,表示大众评委,n表示评委总数。打分规则如下:
//专家评委和大众评委的分数先分别取一个平均分(平均分取整),然后,总分 = 专家评委平均分 * 0.6 + 大众评委 * 0.4,总分取整。
//如果没有大众评委,则 总分 = 专家评委平均分,总分取整。函数最终返回选手得分。
int cal_score(int score[], int judge_type[], int n){
float sum1,sum2;
int ave1,ave2;
for(int i=0;i<n;i++){
if (judge_type[i]==1)
sum1=sum1+score[i];
if (judge_type[i]==2)
sum2=sum2+score[i];
}
ave1=(int)sum1/n;
ave2=(int)sum2/n;
if (sum2==0)
double sum=sum1;
else
sum=sum1*0.6+sum2*0.4;
return sum;
}
//给定一个数组input[] ,如果数组长度n为奇数,则将数组中最大的元素放到 output[] 数组最中间的位置,
//如果数组长度n为偶数,则将数组中最大的元素放到 output[] 数组中间两个位置偏右的那个位置上,
//然后再按从大到小的顺序,依次在第一个位置的两边,按照一左一右的顺序,依次存放剩下的数
void swap(int &x, int &y)
{
int temp = x;
x = y;
y = temp;
}
void sort(int input[], int n, int output[])
{
for (int i = 0; i < n-1; i++) // 冒泡排序,从大到小
{
for (int j = 0; j < n-1-i; j++)
{
if (input[j] < input[j+1])
{
swap(input[j], input[j+1]);
}
}
}
int mid = n/2; // 计算中间位置
int left = mid-1; // 左下标
int right = mid+1; // 右下标
int cnt = 0;
output[mid] = input[cnt++];
while (cnt < n)
{
if (cnt < n)
{
output[left--] = input[cnt++];
}
if (cnt < n)
{
output[right++] = input[cnt++];
}
}
}
//操作系统任务调度问题。操作系统任务分为系统任务和用户任务两种。
//其中,系统任务的优先级 < 50,用户任务的优先级 >= 50且 <= 255。
//优先级大于255的为非法任务,应予以剔除。现有一任务队列task[],长度为n,
//task中的元素值表示任务的优先级,数值越小,优先级越高。函数scheduler实现如下功能,
//将task[] 中的任务按照系统任务、用户任务依次存放到 system_task[] 数组和 user_task[] 数组中
//(数组中元素的值是任务在task[] 数组中的下标),并且优先级高的任务排在前面,优先级相同的任务按照入队顺序排列
//(即先入队的任务排在前面),数组元素为-1表示结束。
void scheduler(int task[], int n, int system_task[], int user_task[])
{
int j,k=0;//分别指向系统任务和用户任务的标记
for(int i=0;i<n;i++)
{
if(task[i]<50)
{//插入法优先级由高到低插入系统任务中
for(int cj=j-1;cj>=0&&task[i]<system_task[cj];cj--)
{//依次后退
system_task[cj]=system_task[cj+1];
}
system_task[cj+1]=task[i];
j++;
}
else if(task[i]>=50&&task[i]<=255)
{//插入法优先级由高到低插入用户任务中
for(int ck=k-1;ck>=0&&task[i]<user_task[ck];ck--)
{//依次后退
user_task[ck]=user_task[ck+1];
}
user_task[ck+1]=task[i];
k++;
}
system_task[i]=-1;
user_task[i]=-1;
}