1012 The Best Rank

本文介绍了一种用于学生成绩排序的算法实现,通过四个不同科目的成绩进行综合排名,并考虑了成绩相同时的并列排名处理。该算法使用C++编写,涉及数组排序、成绩平均分四舍五入计算等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

成绩排序取所有科目成绩中最高的排名.

开了4个数组模拟…. 注意成绩平均分四舍五入,并不能按总分排,其次成绩相等排名并排.

#include <cstdio>
#include <map>
#include <algorithm>
using namespace std;

const double eps = 1e-8;
const int MAXN = 2010;

struct node {
  int id;
  int num;
  int rank;
  friend bool operator<(const node &a, const node &b) {
    return a.num > b.num;
  }
};

node C[MAXN], M[MAXN], E[MAXN], A[MAXN];
map<int, pair<char, int> > s;

void ran(node a[], int n) {
    a[1].rank = 1;
    for (int i = 2; i <= n; i++) {
        if (a[i].num == a[i-1].num)
            a[i].rank = a[i-1].rank;
        else
            a[i].rank = i;
    }
}

void ins(node a[], char c, int n) {
  for (int i = 1; i <= n; i++) 
  {
    if (s[a[i].id].second > a[i].rank) {
      s[a[i].id].first = c;
      s[a[i].id].second = a[i].rank;
    }
  }
}

int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) {
    scanf("%d%d%d%d", &C[i].id, &C[i].num, &M[i].num, &E[i].num);
    A[i].id = M[i].id = E[i].id = C[i].id;
    A[i].num = C[i].num + M[i].num + E[i].num;
    A[i].num = A[i].num * 1.0 / 3 + 0.5 + eps;
  }
  sort(C+1, C+n+1);
  sort(M+1, M+n+1);
  sort(E+1, E+n+1);
  sort(A+1, A+n+1);

  ran(C, n);
  ran(M, n);
  ran(E, n);
  ran(A, n);

  for (int i = 1; i <= n; i++)
    s.insert(make_pair(A[i].id, make_pair('A', A[i].rank)));

  ins(C, 'C', n);
  ins(M, 'M', n);
  ins(E, 'E', n);

  for (int i = 1; i <= m; i++) {
    int id;
    scanf("%d", &id);
    if (s.count(id))
      printf("%d %c\n", s[id].second, s[id].first);
    else
      printf("N/A\n");
  }
  return 0;
}
下面这个代码报错了,应该怎么改: %%Matlab Genetic Algorithm for Sin Prediction clear; clc; %population size Npop=50; %create the population Pop=rand(Npop,1)*2*pi; %define fitness fit=@(x) sin(x); %fitness score score=fit(Pop); %maximum number of generations maxgen=100; %weights w=0.7; %probability p_crossover=0.9; p_mutation=0.2; %loop for number of generations for gen=1:maxgen %ranking %rank the population in descending order [~,rank]=sort(score); %rank the population in ascending order rank=flipud(rank); %normalised rank NormalisedRank=rank/sum(rank); %selection %cumulative sum of the normalised rank cumulativeSum=cumsum(NormalisedRank); %randomly select the two parents %from the populations based on their %normalised rank randnum=rand; parent1=find(cumulativeSum>randnum,1); randnum=rand; parent2=find(cumulativeSum>randnum,1); %crossover %randomly select the crossover point pc=randi([1 Npop-1]); %create the offsprings offspring1=[Pop(parent1,1:pc) Pop(parent2,pc+1:end)]; offspring2=[Pop(parent2,1:pc) Pop(parent1,pc+1:end)]; %perform crossover with a probability if(rand<p_crossover) Pop=[Pop; offspring1; offspring2]; end %mutation %randomly select the point of mutation pm=randi([1 Npop]); %mutate the value under the chosen point Pop(pm)=rand*2*pi; %perform mutation with a probability if (rand<p_mutation) Pop(pm)=rand*2*pi; end %evaluate new population score=fit(Pop); %elitism %sort the population in ascending order %of their fitness score [score,rank]=sort(score); elite=Pop(rank(1),:); Pop(rank(Npop),:)=elite; %replace old population Pop=Pop(1:Npop,:); end %print the best solution disp('Best Solution: '); disp(elite);
02-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值