网易2016研发工师编程题2

奖学金


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


这个题我写了一上午,难怪水平那么差。就因为一个问题,if(sum<=0) return 0;没有及时判断,该学生是否已经达到平均分要求,不用再复习(%40case)。
1、求出还差多少分。
2、将耗时升序排列。有些是把这一对数据写成了结构体,也不错,可以借鉴。
3、从低往后加,满足条件退出。
注意:
1、排序传入函数,如果是引用的话,要const才能在牛客pass,本来这就是规范法,对于传入函数。
2、pair的使用,一对数据,最好用pair,比起vector要好的多,无论是否类型相同。
3、时刻注意数据是否会溢出,要做好防范工作。


#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool compare(const pair<int,int> &pa,const pair<int,int> &pb){
    return pa.second<pb.second;              //升序
}

long long getTime(int n,int r,int avg,vector<pair<int,int>> &v){
    long long sum=n*avg;
    for(int i=0;i<n;++i){
        sum-=v[i].first;
    }
    if(sum<=0)   return 0;
    sort(v.begin(),v.end(),compare);
    long long spend=0;
    for(int i=0;i<n;++i){
        int sub=r-v[i].first;
        if(sum>sub){
            sum-=sub;
            spend+=sub*v[i].second;
        }
        else{
            spend+=sum*v[i].second;
            break;
        }
    }
    return spend;
}

int main(){
    int n,r,avg;
    while(cin>>n>>r>>avg){
        vector<pair<int,int>> v(n);
        for(int i=0;i<n;++i){
            int a,b;
            cin>>a>>b;
            v[i]={a,b};
        }
        cout<<getTime(n,r,avg,v)<<endl;
    }
    return 0;
}

路灯


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


1、iomanip输出格式控制cout.setf(ios::fixed);setprecision(2)
2、max(T,T);同类型
3、排序后求出最大差,然后取半。之后与头尾比较。返回最大。


#include <iostream>
#include <iomanip>//输出格式控制
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
double getD(int n,int l,vector<int> &v){
    sort(v.begin(),v.end());
    vector<int> sub(n);
    sub[0]=0;
    for(int i=1;i<n;++i){
        sub[i]=v[i]-v[i-1];
    }
    double maxd=*(max_element(sub.begin(),sub.end()));
    maxd/=2;
    return max((double)max(v[0]-0,l-v[n-1]),maxd);//max(T,T);
}
int main(){
    int n,l;
    while(cin>>n>>l){
        vector<int> v(n);
        for(int i=0;i<n;++i){
            cin>>v[i];
        }
        cout.setf(ios::fixed);
        cout<<setprecision(2)<<getD(n,l,v)<<endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值