笔试强训第十四天--(幸运的袋子 计算日期到天数的转换)

选择

D

b、c

有三种成员变量必须放在初始化列表初始化

一、const修饰的成员变量

二、引用成员变量

三、自定义类型成员 ( 且该类没有默认构造函数时 )

 .*    ::   sizeof   .   三目运算符 共五个操作符不可以重载

构造函数不能是虚函数,因为虚表中的虚函数指针是在构造函数的初始化列表初始化的。虚表都没初始化,不能构成虚函数。

 

类的默认成员函数:构造、析构、拷贝构造、赋值运算符重载、取地址重载、const取地址重载

D:可以通过静态成员函数调用

class Test
{
public:
    static Test*GetInst()
    {
        return new Test;
    }
private:
    Test()
    {
        cout<<"Test::Test()"<<endl;
    }
};
int main()
{
    Test*pt=Test::GetInst;
    return 0;
}

 

 继承耦合程度高,组合耦合程度低。优先使用组合。

A需要加个虚函数的前提才对。

D中的调用写错了 应该是a->test(1.1) 调用正确的话确实输出的是1 但是此处编译错误

 12

pb指向一块初始化为1的Child的空间 func1()未实现重写,调用的是Base里面的func()1

所以 i=10 pb再次调用getValue(),该函数是虚函数且子类重写,所以调用的是子类中的getValue() 所以i=12

 用父类的对象进行调用,不符合多态。所以调用的都是B0的dispaly()

B 可以且推荐写成虚函数

class A class B class C class D

构造顺序和继承顺序相同,由于是虚拟继承,用B或者用C构造A的成员都不合适,所以D的构造函数中的初始化列表阶段,A(s1)不能少

编程

幸运的袋子

幸运的袋子_牛客题霸_牛客网

思路: 随便拿个数组以 1 1 3 5 7为例,可以的组合就是 113 115 117 13 15 17,本题就相当于是在一个集合中挑一些满足条件的子集。这类问题一般使用回溯算法。

唯一有不同的是,在本题的条件中,要想和大于积,必须其中一个数是1。而单独一个1,或者11又不满足条件。所以需要进行特判。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

//所有球的号码的 和 大于所有球的号码的 积 
//dfs 
int dfs(vector<int>&nums,int curi,int sum,int mul)
{
    int count=0;
    for(int i=curi;i<nums.size();i++)
    {
        sum+=nums[i];
        mul*=nums[i];
        if(sum>mul)
        {
            count=count+1+dfs(nums,i+1,sum,mul);
        }
        else if(nums[i]==1) // 1 1 不是幸运袋子 但是 后续可能有其他非1值 
                            //就可以成为幸运的袋子
        {
            count+=dfs(nums,i+1,sum,mul);
        }
        else 
        {
            break;
        }
        sum-=nums[i];
        mul/=nums[i];

        //去重
        //走到这就证明当前不行了 把和他一样的值剪掉
        while(i<nums.size()-1 && nums[i]==nums[i+1]) i++;
    }
    return count;
}
int main()
{
    int n;
    cin>>n;
    vector<int>nums(n,0);
    for(int i=0;i<n;i++)
    {
        cin>>nums[i];
    }
    //排序 方便剪枝
    sort(nums.begin(),nums.end());
    cout<<dfs(nums,0,0,1)<<endl;
    return 0;
}

计算日期到天数的转换

计算日期到天数转换_牛客题霸_牛客网

#include <iostream>
#include <vector>
using namespace std;
int get_month_day(int n)
{
    int result=0;
    static int arr[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    for(int i=0;i<n;i++)
    {
        result+=arr[i];
    }
    return result;
}
int main()
{
    int year,month,day;
    cin>>year>>month>>day; 
    int result=get_month_day(month);
    if(month>2 && ((year%4==0 &&year%100!=0) || year%400==0))
    {
        result+=1;
    } 
    cout<<result+day<<endl;
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值