POJ - 1245 Programmer, Rank Thyself

Time Limit: 1000MS

Memory Limit: 10000KB

64bit IO Format: %I64d & %I64u

[Submit]   [Go Back]   [Status]

Description

Implement a ranking program similar to the one used for this programming contest.

Input

The input file contains one or more contests followed by a line containing only zero that signals the end of the file. Each contest begins with a line containing a positive integer c no greater than 20 indicating the number of teams in the contest, and is followed by c lines that contain a team name and the solution times for seven problems, separated by spaces. Team names consist of between one and ten letters. All team names within a contest are unique. Times are nonnegative integers no greater than 500.

As described in the Notes to Teams, teams are ranked first by greatest number of problems solved, then by least total time, then by least geometric mean of all nonzero times. Teams that are still tied are given the same numeric ranking and are listed in alphabetical order, using case-sensitive string comparison. The numeric ranking for a team is always one more than the number of teams ranked ahead of (not tied with) that team. For this problem all geometric means will be rounded to an integer as described below, and only the rounded value will be used when computing rankings and displaying results.

If all times are zero, then the geometric mean is also zero. Otherwise, if there are n nonzero times t1, ..., tn, then the geometric mean is defined to be

exp ((ln t1 + ln t2 + ... + ln tn) / n)

where exp x means ex and ln x means the natural logarithm of x. (There are other mathematically equivalent definitions of the geometric mean, but they may produce slightly different answers due to roundoff and/or overflow problems. Use this definition to get the same answers as the judges.) After computing the geometric mean, round it to an integer by adding 0.5 and truncating any fractional digits. (C/C++ and Java automatically truncate fractions when casting a floating-point type to an integral type. In Pascal use the trunc function.)

Output

For each contest you must output the rankings in a table. All tables will have the same width, with the length equal to the number of teams entered in the contest. Use the exact format shown in the examples. Each contest has a numbered header followed by a table with one team entry per line. Each entry contains the ranking, team name, problems solved, total time, geometric mean, and then the individual solution times in the same order they appeared in the input. In the first example all values completely fill their fields. In general you may need to pad values with spaces (never tabs) so that they have the correct field width. The team name is left-justified, and all other fields are right-justified. The ranking always has two digits, including a leading zero if necessary. Spaces will never appear at the beginning or end of lines.

Sample Input

1

Plutonians 123 234 345 456 167 278 389

4

Xap 0 0 0 0 0 0 0

Foo 20 30 0 50 40 0 10

Bar 0 50 20 0 10 40 30

Baz 0 0 0 0 0 0 0

3

Venus 213 0 0 57 0 0 0

Neptune 0 0 0 117 153 0 0

Mars 0 150 0 0 0 0 120

0

Sample Output

CONTEST 1

01 Plutonians 7 1992 261 123 234 345 456 167 278 389

CONTEST 2

01 Bar        5  150  26   0  50  20   0  10  40  30

01 Foo        5  150  26  20  30   0  50  40   0  10

03 Baz        0    0   0   0   0   0   0   0   0   0

03 Xap        0    0   0   0   0   0   0   0   0   0

CONTEST 3

01 Venus      2  270 110 213   0   0  57   0   0   0

02 Mars       2  270 134   0 150   0   0   0   0 120

02 Neptune    2  270 134   0   0   0 117 153   0   0

Source

Mid-Central USA 2002

[Submit]   [Go Back]   [Status]

 #include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h> struct rank {
char name[];
int sol, tot, g, p[], ind;
};
rank ranks[]; int comp(const void *c, const void *d)
{
rank *a = (rank *)c;
rank *b = (rank *)d;
if(a->sol > b->sol) return -;
else if(a->sol < b->sol) return ;
else {
if(a->tot < b->tot) return -;
else if(a->tot > b->tot) return ;
else {
if(a->g < b->g) return -;
else if(a->g > b->g) return ;
else {
return strcmp(a->name, b->name);
}
}
} } int main()
{
// freopen("data.in", "r", stdin);
// freopen("data.out", "w", stdout);
int n = , cnt = ;
while(scanf("%d", &n)) {
if(!n) break;
for(int i = ; i < n; i++) {
double t = ;
ranks[i].sol = , ranks[i].tot = , ranks[i].g = ;
scanf("%s", &ranks[i].name);
for(int j = ; j < ; j++) {
scanf("%d", &ranks[i].p[j]);
if(ranks[i].p[j]) {
ranks[i].sol++;
ranks[i].tot += ranks[i].p[j];
t += log((double)ranks[i].p[j]);
}
}
if(ranks[i].sol > ) {
ranks[i].g = exp(t/ranks[i].sol) + 0.5;
}
}
qsort(ranks, n, sizeof(rank), comp);
printf("CONTEST %d\n", cnt);
cnt++;
for(int i = ; i < n; i++) {
if(i < ) {
printf("");
}
if(i > && ranks[i].sol == ranks[i-].sol && ranks[i].tot == ranks[i-].tot && ranks[i].g == ranks[i-].g) {
ranks[i].ind = ranks[i-].ind;
}
else {
ranks[i].ind = i + ;
}
printf("%d %-10s %d %4d %3d %3d %3d %3d %3d %3d %3d %3d\n", ranks[i].ind, ranks[i].name, ranks[i].sol, ranks[i].tot, ranks[i].g,
ranks[i].p[], ranks[i].p[], ranks[i].p[], ranks[i].p[], ranks[i].p[], ranks[i].p[], ranks[i].p[]); } }
return ;
}

POJ - 1245 Programmer, Rank Thyself的更多相关文章

  1. POJ 2379 ACM Rank Table(排序)

    题很水,数据注意一下四点即可: 1.有些team会在一道题AC了之后还提交,这个时候只需要算第一次ac的时间以及这之前的wa,之后的全部忽略.2.如果一道题没有ac,那么在计算时间时不应该加上它的wa ...

  2. HOJ题目分类

    各种杂题,水题,模拟,包括简单数论. 1001 A+B 1002 A+B+C 1009 Fat Cat 1010 The Angle 1011 Unix ls 1012 Decoding Task 1 ...

  3. poj 2153 Rank List

    原题链接:http://poj.org/problem?id=2153 简单题,map,平衡树均可.. map: #include<algorithm> #include<iostr ...

  4. POJ 2153 Rank List (map映射)

    水题,竟然花了那么多时间...主要是不知道为什么,明明在本机上编译过去了,但是用c++提交却编译错误...最后用g++提交AC 题意:给出n个学生的名字,然后给出m个测验. 每个测验给出n个学生的分数 ...

  5. POJ 2970 The lazy programmer(优先队列+贪心)

    Language: Default The lazy programmer Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 1 ...

  6. poj 2153 Rank List(查找,Map)

    题目链接:http://poj.org/problem?id=2153 思路分析: 判断Li Ming的成绩排名,需要在所有的数据章查找成绩比其高的人的数目,为查找问题. 查找问题可以使用Hash表, ...

  7. POJ 2970 The lazy programmer

    The lazy programmer Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 2785   Accepted: 70 ...

  8. POJ 2970 The lazy programmer(贪心+单调优先队列)

    A new web-design studio, called SMART (Simply Masters of ART), employs two people. The first one is ...

  9. 【转载】图论 500题——主要为hdu/poj/zoj

    转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

随机推荐

  1. C#面向对象之属性

    1.属性的定义及使用 class MyClass { ; //属性的定义 private string name = ""; //属性的定义 public int Id { get ...

  2. pushState()、popstate事件配合ajax实现浏览器前进后退页面局部刷新

    最近研究pushState,看了网上的文章还是不怎么会用,于是自己摸索着理解使用,终于实现局部刷新同时前进后退. 首先说说pushState(),这个函数将当前的url等信息加入history堆栈中: ...

  3. Qt 控件随窗口缩放

    在Qt的界面设计中,我们有时候希望窗口在最大化的时候,上面的控件也跟着缩放,那么我们就需要调整控件的SizePolicy属性,关于这个属性的讲解请参见我之前的博客Qt SizePolicy 属性,由于 ...

  4. [CareerCup] 17.13 BiNode 双向节点

    17.13 Consider a simple node-like data structure called BiNode, which has pointers to two other node ...

  5. [LintCode] Left Pad 左填充

    You know what, left pad is javascript package and referenced by React: Github link One day his autho ...

  6. c# 考试

    重点:值类型的变量直接存放实际的数据,存储在内存的栈中: 引用类型的变量存放的则是数据的地址,即对象的引用.存储在内存的堆中,而内存单元中只存放堆中对象的地址 常见的值类型数据有:整值型(整形,浮点型 ...

  7. bootstrap学习笔记之二

    学习表单时还是有些吃力的,主要感觉有些结构有些复杂,没有自己亲手去操作就感觉似懂非懂,所以还得自己亲手测一下. 现在开始按钮的学习. 可作为按钮使用的标签和元素有:  <a>.<bu ...

  8. sql 执行 delete 的时候,结合子查询 exists ,怎样支持别名呢?

    在做一个数据删除的时候,条件需要用到关联其他表,用到子查询,但是查询的时候使用 别名 没有问题,但是删除就有语法错误,在网上查询后得到了完美解决: --查询出来需要删除的数据 select * fro ...

  9. iframe父子页面之间相互调用元素和函数

    <!doctype html> <html> <head> <meta http-equiv="Content-Type" content ...

  10. mysql导数据库用到的语句

    将字段格式为2013-08-09 13:22:55转换为时间戳 UPDATE `AttendClass` SET `regdate` = unix_timestamp(regDate2) WHERE ...