XTU online judge 1297 Homework

Description
鉴于很多同学Ctrl+A,Ctrl+C,Ctrl+V的问题,Eric想重新计算一下作业成绩,成绩计算的规则如下:
1.每道题按正确提交的先后顺序给分,第1-12名32,13-24名16分,25-48名8分,49-96名4分,97-192名2分,其余1分。
2.学生所有题目的分数累加和为其积分。
3.作业成绩=round(100+log(1+(本人积分−最高积分)/最高积分 )×10) ,其中round为四舍五入取整,log以自然对数为底。

Eric已经通过查询数据库得到每个人每道题的排名情况,请写一个程序帮Eric算一下所有人的作业成绩。

Input
输入包含若干行,每行是三个部分,题目号,学号,排名。
学生人数不超过500,题目数量不超过200。

Output
输出学号和成绩,并按学号正序排列,作业成绩逆序排列显示。

Sample Input
1054 2015551111 1
1054 2015551101 2
1054 2015551119 3
1054 2015551115 4
1054 2015551110 5
1054 2015551114 6
1054 2015551128 7
1054 2015551118 8
1054 2015551102 9
1054 2015551130 10
1054 2015551139 11
1054 2015551135 12
1054 2015551120 13
1054 2015551129 14
1054 2015551104 15
1054 2015551112 16
1054 2015551116 17
1054 2015551138 18
1054 2015551103 19
1054 2015551131 20
1054 2015551132 21
1054 2015551106 22
1054 2015551136 23
1054 2015551124 24
1054 2015551126 25
1054 2015551113 26
1054 2015551109 27
1054 2015551117 28
1054 2015551125 29
1054 2015551127 30
1054 2015551123 31
1054 2015551133 32
1054 2015551134 33
1054 2015551121 34
1054 2015551122 35
1054 2015551137 36

Sample Output
2015551101 100
2015551102 100
2015551110 100
2015551111 100
2015551114 100
2015551115 100
2015551118 100
2015551119 100
2015551128 100
2015551130 100
2015551135 100
2015551139 100
2015551103 93
2015551104 93
2015551106 93
2015551112 93
2015551116 93
2015551120 93
2015551124 93
2015551129 93
2015551131 93
2015551132 93
2015551136 93
2015551138 93
2015551109 86
2015551113 86
2015551117 86
2015551121 86
2015551122 86
2015551123 86
2015551125 86
2015551126 86
2015551127 86
2015551133 86
2015551134 86
2015551137 86

解题思路:
按题意直接模拟即可。

#include<bits/stdc++.h>
using namespace std;
//数组a存学号数组b存排名 通过下标将a,b捆绑
__int64 a[501];
int b[501];

int trans(int x)
{
    if(x>=1 && x<=12)
        x = 32;
    else if(x>=13 && x<=24)
        x = 16;
    else if(x>=25 && x<=48)
        x = 8;
    else if(x>=49 && x<=96)
        x = 4;
    else if(x>=97 && x<=192)
        x = 2;
    else if(x>=193)
        x = 1;
    return x;
}

int swapp(int x,int y)
{
    int temp;
    temp = a[x];
    a[x] = a[y];
    a[y] = temp;
    
    temp = b[x];
    b[x] = b[y];
    b[y] = temp;
    
    return 0;
}

int main()
{
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
    int n;
    int rank;
	int flag=1;
	int i,j;
    while(scanf("%d %I64d %d",&n,&a[flag],&rank)!=EOF)
    {
        for(i=0; i<flag; i++)
        {
            if(a[i]==a[flag])
            {
                break;
            }
        }
        //将排名转换成积分
        b[i] += trans(rank);
        if(i==flag)
            flag++;
    }
    
    int num,judge=1;
    num=flag-1;
    while(judge)
    {
        //冒泡将积分排序
        judge = 0;
        for(i=1;i<num;i++)
        {
            if(b[i]<b[i+1])
            {
                swapp(i,i+1);
                judge = 1;
            }
        }
    }
    int k;
    double q,w;
    q = b[1];
    //将积分转为分数
    for(i=1;i<=num;i++)
    {
        w = log(b[i]/q)*10+100.5;
        b[i] = w;
    }
    
    for(i=1;i<num;i++)
    {
    	//寻找积分相同的区间段
        k = i;
        while(b[i]==b[i+1])
        {
            i++;
        }
        
        judge = 1;
        while(judge)
        {
        	//冒泡将学号排序
            judge = 0;
            for(j=k;j<i;j++)
            {
                if(a[j]>a[j+1])
                {
                    swapp(j,j+1);
                    judge = 1;
                }
            }
        }
    }
    for(i=1;i<=num;i++)
        printf("%I64d %d\n",a[i],b[i]);
    return 0;
}
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值