网易2016研发工程师编程题

本文解析了两道算法题目:一是如何计算学生为达到奖学金所需的最低复习时间;二是确定最少路灯覆盖范围以照亮整条街道的方法。文章提供了完整的代码实现及思路分析。

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

http://www.nowcoder.com/test/710847/summary

[编程题] 奖学金
小v今年有n门课,每门都有考试,为了拿到奖学金,小v必须让自己的平均成绩至少为avg。每门课由平时成绩和考试成绩组成,满分为r。现在他知道每门课的平时成绩为ai ,若想让这门课的考试成绩多拿一分的话,小v要花bi 的时间复习,不复习的话当然就是0分。同时我们显然可以发现复习得再多也不会拿到超过满分的分数。为了拿到奖学金,小v至少要花多少时间复习。

输入描述:
第一行三个整数n,r,avg(n大于等于1小于等于1e5,r大于等于1小于等于1e9,avg大于等于1小于等于1e6),接下来n行,每行两个整数ai和bi,均小于等于1e6大于等于1


输出描述:
一行输出答案。

输入例子:
5 10 9
0 5
9 1
8 1
0 1
9 100

输出例子:
43


#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

bool compare( const vector<long> &lhs, const vector<long> &rhs )
{
    if( lhs[1] >= rhs[1] )
    {
        return false;
    }
    else
    {
        return true;
    }
}


int main()
{
    int ret = 0;

    long long n = 0;
    long long r = 0;
    long long avg = 0;
    long long sum = 0;
    long long spendTime = 0;

    vector< vector<long> > grades;

    while( cin >> n >> r >> avg )
    {
        sum = n * avg;
        spendTime = 0;
        grades.clear();

        long long curSum = 0;

        for( int i = 0; i < n; i++ )    
        {
            long long a = 0;
            long long b = 0;
            cin >> a >> b;
            curSum += a;

            vector<long> tmp;
            tmp.push_back(a);
            tmp.push_back(b);

            grades.push_back(tmp);

        }

        if( n * avg > n * r )
        {
            cout << -1 << endl;
            continue;
        }

        if( curSum >= sum )
        {
            cout << spendTime << endl;
            continue;
        }

        sort( grades.begin(), grades.end(), compare );
        int i = 0;

        for( i = 0; i < n; i++ )
        {
            while( grades[i][0] < r )
            {
                spendTime += grades[i][1];
                curSum += 1;
                grades[i][0]++;

                if( curSum >= sum )
                {
                    break;
                }
            }

            if( curSum >= sum )
            {
                break;
            }
        }

        if( i < n )
        {
            cout << spendTime << endl;
        }
        else
        {
            cout << -1 << endl;
        }
    }


    return ret;
}




[编程题] 路灯
一条长l的笔直的街道上有n个路灯,若这条街的起点为0,终点为l,第i个路灯坐标为ai,每盏灯可以覆盖到的最远距离为d,为了照明需求,所有灯的灯光必须覆盖整条街,但是为了省电,要是这个d最小,请找到这个最小的d。

输入描述:
每组数据第一行两个整数n和l(n大于0小于等于1000,l小于等于1000000000大于0)。第二行有n个整数(均大于等于0小于等于l),为每盏灯的坐标,多个路灯可以在同一点。


输出描述:
输出答案,保留两位小数。

输入例子:
7 15
15 5 3 7 9 14 0

输出例子:
2.5


#include <iostream>
#include <algorithm>
#include <vector>


using namespace std;

int main()
{
    int ret = 0;
    const int NUM = 1001;
    int data[NUM];  // 换成float data[NUM]竟然出现只通过90%的测试用例
    int n = 0;
    int l = 0;

    while( cin >> n >> l )
    {
        for( int i = 0; i < n; i++ )
        {
            cin >> data[i];
        }

        sort( data, data + n, less<int>() );

        int result = -1;

        for( int i = 1; i < n; i++ )
        {
            if( ( data[i] - data[ i - 1 ] ) > result )
            {
                result = data[i] - data[ i - 1 ];
            }
        }

        int max1 = data[0] > ( l - data[ n - 1 ] ) ? data[0] : ( l - data[ n - 1 ] );

        if( result / 2 < max1 )
        {
            result = max1;
            printf( "%.2f\n", (double)result );
            continue;
        }

        printf( "%.2f\n", (double)result / 2 );
    }

    return ret;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值