列表

详情


MT29. 题目列表

描述

    小明同学收集了 n 道编程问题,他想做一个网站把这些题目放在上面,对于每一道问题给出问题的名称 name ,该问题的提交次数 X ,该问题的通过次数 Y。一个问题的通过率定义为 Y/X 。小明根据通过率把问题难度分了 3 个登记:
    1.通过率 ,难度为 5
    2.通过率 ,难度为 4
    3.通过率 ,难度为 3
    为了方便大家查阅题目,小明希望所有题目按照题目名称的字典序从小到大排列在网站上,并且能显示每个题目的难度,你能帮他实现吗?

数据范围: ,每个 name 的长度满足 ,name 中只有小写字母, 。保证输入的名称各不相同

输入描述

输入一个数 n ,接下来有 n 行,每行输入一个字符串 name ,整数 X ,证书 Y ,依次表示每个题目的名称,提交次数和通过次数。

输出描述

输出 n 行,按字典序从小到大排序后的题目,每行先输出一个字符串,题目的名称,再输出一个数,题目的难度等级用一个空格隔开。

示例1

输入:

4
math 100 90
algorithm 10 8
string 50 1
dp 100 50

输出:

algorithm 3
dp 4
math 3
string 5

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 328KB, 提交时间: 2021-09-17

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int cmp(const void*a,const void* b)
{
    return strcmp(*(char**)a, *(char**)b);
}

int main()
{
    int n=0;
    scanf("%d",&n);
    char** c = (char**)malloc(sizeof(char*)*n);
    int x = 0,y=0;
    float z = 0;
    for(int i=0;i<n;i++)
    {
        c[i] = (char*)malloc(sizeof(char)*110);
        scanf("%s",c[i]);
        int len = strlen(c[i]);
        c[i][len] = ' ';
        scanf("%d %d",&x,&y);
        z =(float) y/x;
        if(z>=0 && z <=0.3)
        {
            c[i][len+1] ='5';
        }
        else if(z>0.3 && z <=0.6)
        {
            c[i][len+1] ='4';
        }
        else 
        {
            c[i][len+1] ='3';
        }
    }
    qsort(c,n,sizeof(char*),cmp);
    for(int i =0;i<n;i++)
    {
        printf("%s\n",c[i]);
    }
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 332KB, 提交时间: 2021-10-23

#include <stdio.h>
#include <string.h>

int Diff(int x, int y);
//计算难度
int Diff(int x, int y)
{
    double div = (double)y/(double)x;
    if(div > 0.6)
        return 3;
    else if(div > 0.3)
        return 4;
    else
        return 5;
}

int n;
char arr[110][110];
//定义一个数组存放难度
int diff[110];
int Min[110];

int main()
{
    int i, j, x, y, min;
    scanf("%d", &n);
    getchar();
    for(i = 0; i < n; i++)
    {
        scanf("%s %d %d", &arr[i], &x, &y);
        getchar();
        //计算难度
        diff[i] = Diff(x, y);
    }
    for(i=0;i<n;i++)
    {
        for(min=0; Min[min]; min++);
        for(j=min+1;j<n;j++)
            if(!Min[j] && strcmp(arr[j],arr[min])<0)
                min = j;
        for(j=0;arr[min][j];j++)
            putchar(arr[min][j]);
        printf(" %d\n",diff[min]);
        Min[min] = 1;
    }
    return 0;
}

上一题