CodeForces 24B F1 Champions (简单题)

题目类型  简单题


题目意思
输入 n 场赛车比赛的前 m 名的选手的名字 其中只有前10名的选手可以得到分数(1 <= n <= 20, 1 <= m <= 50)

现在有两种排序方法 输出两种排序方法中排在第1的人的名字
方法一 先按 得分排序 得分相同的 按排在第1的次数排序(多的排在前面) 如果次数相同就按排在第2的次数排序 直到比较出来为止
方法二 先按排在第1的次数排序 次数相同的话按得分高低排序 得分相同的按排在第2的次数排序 还是相同的按排在第3的次数排序 直到比较出来为止

解题方法
统计信息然后排序即可

注意
每场比赛只有前10名可以得分 其他名次得0分但是依然可以得到 相应的名次的次数 (注意数组越界什么的)

参考代码 - 有疑问的地方在下方留言 看到会尽快回复的
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

typedef long long LL;

const int MAXN = 1e3 + 10;

struct P {
  string name;
  int s;
  int w;
  vectorrank;
}p[MAXN];

bool cmp1(const P & a,const P & b) {
  if(a.s == b.s) {
    int i=0;
    while(1) {
      if(a.rank[i] == b.rank[i]) {
        i++;
        if(a.rank.size() == i) return 0;
        else if(b.rank.size() == i) return 1;
        continue;
      }
      else return a.rank[i] < b.rank[i];
    }
  }
  return a.s > b.s;
}

bool cmp2(const P & a,const P & b) {
  if(a.w == b.w) {
    if(a.s == b.s) {
      int i = 0;
      while(1) {
        if(a.rank[i] == b.rank[i]) {
          i++;
          if(a.rank.size() == i) return 0;
          else if(b.rank.size() == i) return 1;
          continue;
        }
        else return a.rank[i] < b.rank[i];
      }
    }
    else return a.s > b.s;
  }
  return a.w > b.w;
}


int main() {
  int n;
  int a[100] = {25, 18, 15, 12, 10, 8, 6, 4, 2, 1};
  while(cin>>n) {
    for( int i=0; istr;
    set::iterator ps;
    int k = 0;
    for( int i=0; i>m;
      for( int j=0; j>name;
        if(str.find(name) == str.end()) {
          str.insert(name);
          p[k].name = name;
          p[k].s = a[j];
          if(j == 0) p[k].w++;
          //cout<<"--"<

你可能感兴趣的:(简单题,codeforces,简单题)