网易2018C++笔试

在这里插入图片描述

编程题

  1. 小Q得到一个神奇的数列: 1, 12, 123,…12345678910,1234567891011…。
    并且小Q对于能否被3整除这个性质很感兴趣。
    小Q现在希望你能帮他计算一下从数列的第l个到第r个(包含端点)有多少个数可以被3整除。
    【解题思路】这道题可以通过找规律来实现
    在这里插入图片描述
#include<iostream>
using namespace std;
int main()
{
    long l, r;
    cin >> l >> r;
    int count = 0;
    while(l <= r)
    {
        if(l % 3 != 1)
            ++count;
        l++;
    }
    cout << count << endl;
    return 0;
}
  1. 小Q正在给一条长度为n的道路设计路灯安置方案。
    为了让问题更简单,小Q把道路视为n个方格,需要照亮的地方用’.‘表示, 不需要照亮的障碍物格子用’X’表示。
    小Q现在要在道路上设置一些路灯, 对于安置在pos位置的路灯, 这盏路灯可以照亮pos - 1, pos, pos + 1这三个位置。
    小Q希望能安置尽量少的路灯照亮所有’.'区域, 希望你能帮他计算一下最少需要多少盏路灯。
    【思路】一次性判断三个字符
#include <iostream>
using namespace std;
int main()
{
    int n, len;
    string str;
    cin >> n;
    for(int i = 0; i < n; i++)
    {
        cin >> len;
        cin >> str;
        int count = 0;
        for(int j = 0; j < str.length(); j++)
        {
            if(str[j] == '.')
            {
                ++count;
                j += 2;
            }
        }
        cout << count << endl;
    }
    return 0;
}
  1. 牛牛准备参加学校组织的春游, 出发前牛牛准备往背包里装入一些零食, 牛牛的背包容量为w。
    牛牛家里一共有n袋零食, 第i袋零食体积为v[i]。
    牛牛想知道在总体积不超过背包容量的情况下,他一共有多少种零食放法(总体积为0也算一种放法)。
#include <iostream>
using namespace std;
long long v[40];

int n;
long long ans=0,w;

void dfs(int t,long long sum)
{
    ans++;
    if(t == n - 1)
        return;
    else
    {
            for(int i = t + 1; i < n; i++)
            {
                if(sum + v[i] <= w)
                    dfs(i, sum + v[i]);
            }
    }
}

int main()
{
    cin >> n >> w;
    long long sum=0;
    for(int i = 0; i < n; i++)
    {
        cin >> v[i];
        sum += v[i];
    }
    if(sum<=w) //如果零食总体积不超过背包容量,那么直接返回 pow(2, n)
    {
        ans=1 << n;//根据题目,0个也算进去,那就正好是左移n位
    }
    else
    {
        dfs(-1,0);
    }
    cout << ans << endl;
    return 0;
}

问答题

在这里插入图片描述
在这里插入图片描述

#include <iostream>
#include <vector>
using namespace std;
int main()
{
	vector<vector<int>> tasks;
    int n; //n项工作
    int count = 1;
    cin >> n;
    for(int i = 0; i < n; i++)
    {
        vector<int> time;  //记录每项任务的开始时间和结束时间
        for(int j = 0; j < 2; j++)
        {
            int temp;
            cin >> temp;
            time.push_back(temp);
        }
        tasks.push_back(time);
    }
    //每一个任务按照结束时间排序
    for(int i = 0; i < n - 1; i++)
    {
        //根据每项任务的结束时间进行从小到大排序
        if(tasks[i][1] > tasks[i + 1][1])
            swap(tasks[i], tasks[i + 1]);
    }
    int i = 0;
    int j = 1;
    while(j <= n - 1)
    {
        //如果下一个任务的开始时间大于前一个任务的结束时间
        if(tasks[j][0] > tasks[i][1])
        {
           ++count;  //将将任务数加1
           i = j;
           j ++;
        }
        else  //否则换到下一个任务,继续进行比较
        {
            j++;
        }
    }
    cout << count << endl;
    return 0;
}
  1. 从结束时间最早的事件开始计算,保证了从起始点到该点之间,该事件的时间最短,为了防止重叠,要保证下一事件开始时间晚于该时间结束时间,起始点相当于从第一个时间结束的时间开始,继续按照上面的思路来选择下一个事件,这样就保证了每段都是最优,最后的结果也是最优。

在这里插入图片描述
在这里插入图片描述
【原因】

  1. A a; 只调用基类的构造函数 输出A
  2. B b(a); 首先调用父类构造函数,输出A ; 其次应该是子类成员变量构造函数,注意区分成员变量和成员函数,一般成员变量在private里,也就是到了 private: A _a; 这时发现构造函数的初始化列表里把a赋给了_a,而a是之前已经创建了的,所以这里隐式调用拷贝构造函数,不再调用A的构造函数了; 最后是B类自己的构造函数,输出了B
    所以构造函数是AAB 但是发现析构函数是BAAA 差别就是因为刚才的隐式调用拷贝构造函数,但是析构函数必须是显式调用,所以会先把B的析构,然后是B的成员函数也就是A类对象_a的析构函数,然后是B的父类的析构函数,最后是A类的析构函数。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值