1062 Talent and Virtue (25 分) (水题)

这篇博客主要展示了如何用C++处理数组,根据特定条件进行筛选和排序。程序首先读取数据,然后根据给定的条件将元素分为不同类别,并进行排序。条件包括元素的两个属性是否满足特定范围,最后输出符合条件的元素及其相关信息。

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
#define ll long long
struct stu
{
    int num;
    int d,c;
    int lei;
    int sum;
}q[maxn];
int cmp(stu a,stu b)
{
    if(a.lei==b.lei)
    {
        if(a.sum==b.sum)
        {
            if(a.d==b.d)
            {
                return a.num<b.num;
            }
            return a.d>b.d;
        }
        return a.sum>b.sum;
    }
    return a.lei<b.lei;
}
int main()
{

    int n,l,h;
    int cnt=0;
    scanf("%d%d%d",&n,&l,&h);
    for(int i=0;i<n;i++)
    {
        q[i].lei=0;
        q[i].sum=0;
    }

    for(int i=0;i<n;i++)
    {
        scanf("%d%d%d",&q[i].num,&q[i].d,&q[i].c);
        q[i].sum=q[i].c+q[i].d;
        if(q[i].d>=h&&q[i].c>=h)
        {
            cnt++;
            q[i].lei=1;
        }
        else if(q[i].d>=h&&q[i].c<h&&q[i].c>=l)
        {
            cnt++;
            q[i].lei=2;
        }
        else if((q[i].d<h&&q[i].c<h&&q[i].c>=l&&q[i].d>=l)||(q[i].c>=h&&q[i].d<h&&q[i].d>=l))
        {
//            printf("%d\n",q[i].c);
            cnt++;
            if(q[i].d>=q[i].c)
            {
                q[i].lei=3;
            }
            else
                q[i].lei=4;
        }
    }
    printf("%d\n",cnt);
    sort(q,q+n,cmp);
    for(int i=0;i<n;i++)
    {
        if(q[i].lei>0)
        printf("%d %d %d\n",q[i].num,q[i].d,q[i].c);
    }

}

### C++ 中的虚函数概念 #### 定义与作用 在面向对象编程中,为了实现多态机制,C++引入了虚函数的概念。通过关键字`virtual`声明成员函数为虚函数之后,允许派生类重写此方法并动态绑定到具体实例上[^1]。 #### 声明方式 要在基类中定义一个普通的虚函数,只需简单地在其前加上`virtual`修饰符即可: ```cpp class Base { public: virtual void show() { cout << "Base class"; } }; ``` 对于派生类而言,则可以通过覆盖(即使用相同的签名重新定义)这些被标记成虚拟的方法来改变行为: ```cpp class Derived : public Base{ public: void show() override{cout<<"Derived class";} }; ``` 这里需要注意的是,在现代C++标准里推荐显式指定`override`以表明意图并且防止拼写错误引发的问[^2]。 #### 动态派过程解析 每当创建含有至少一个虚函数的对象时,编译器会自动为其配一块隐藏区域用于保存指向_vtable_(虚函数表)的指针。而_vptr_(虚表指针)则始终位于对象内存布局最前端位置以便快速访问。当调用某个可能涉及继承体系内不同版本的选择时,程序运行期间将会依据当前实际类型的_vptr_所指示的位置去查找对应的目标地址完成最终跳转操作[^3]。 ```cpp #include <iostream> using namespace std; // 定义基类 class Animal { protected: string name; public: explicit Animal(const char* n):name(n){} virtual ~Animal(){} virtual void speak(){cout<<this->name<<" makes a sound.";} }; // 继承自基类的新类型 class Dog : public Animal { public: using Animal::Animal; // 使用父级构造参数初始化列表简化语法糖 void speak() override { cout << this->name << " barks loudly."; } }; int main(){ auto p_animal = new Dog("Rex"); p_animal->speak(); // 输出:"Rex barks loudly." delete p_animal; return 0; } ``` 上述例子展示了如何利用虚函数特性让同一接口表达出多种不同的语义逻辑,从而达到更加灵活的设计目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值