类的小小练习

写在前面:其实本次线上赛的题目实际上并不是一定要用类

我就小摸了下两道打卡题,下面这两个使用类的解法是后来搞的


1529:纪念日

题意:

MJ在y年m月d日结婚,他把这一天视为新纪元第0天。MJ想知道新纪元第1314天对应的是哪一年哪一月哪一日。

输出格式:

针对每组案例,输出3个整数,表示新纪元第1314天对应的年月日,每两个数之间留一个空格,每组案例输出完都要换行。

题解:

类似于作业3的最后一小题,较那道题难度稍微会低一点。

using namespace std;
int Day[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };//首先定义全局变量存储日期
class Date {
public://在平时做题中 ,没特别要求的话,我一般用 public 方便后面引用,不过以后做项目还是要学 private
    int year, mouth, day;
    Date(int y, int m, int d);//构造函数的声明
    void increase()
    {
        if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)//除了上学期有一道《三天以后》之外,oj闰年都这样判断
            Day[2] = 29;
        else Day[2] = 28;//判断闰年以确定二月有几天
        day += 1314;
        while (day > Day[mouth])
        {
            day -= Day[mouth];
            mouth++;
            if (mouth == 13)//月份进一位
            {
                mouth -= 12;
                year++;
                if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
                    Day[2] = 29;
                else Day[2] = 28;//重判闰年
            }
        }
    }
    void display()
    {
        cout << year << " " << mouth << " " << day << endl;
    }
};
Date::Date(int y, int m, int d)//构造函数的函数体
{
    year = y, mouth = m, day = d;
}
/*
上面那段也可以写成:
Date::Date(int y, int m, int d):year(y), mouth(m), day(d){}
*/
int main()
{
    int n;
    cin >> n;
    while (n--)
    {
        int year, month, day;
        cin >> year >> month >> day;
        Date d(year, month, day);
        d.increase();
        d.display();
    }
    return 0;
}

1524:ovo的崇拜者

题意:

分析消息。消息是一个由小写英文字母组成的字符串,字符串中连续三个字符依次组成ovo的情况越多(即包含子串ovo的数目越多),代表学弟越崇拜ovo。

现在请帮忙找出最崇拜ovo的学弟。注意字符串中包含的ovo可能有重叠,例如ovovo算作包含2个ovo。

输出格式:

多组案例。输出两行结果,第一行是最崇拜ovo的学弟的名字。如果最崇拜的学弟有多个并列第一,则按照输入的顺序将他们的名字依次输出,每两个名字之间留一个空格;

第二行是一个整数,表示最崇拜ovo的学弟发出的消息里有几个ovo子串。这个数字输出完要换行。

题解:

定义一个类Xuedi,记录每个学弟的姓名和信息中含有的ovo个数。

using namespace std;
typedef long long ll;
class Xuedi
{
public:
    string name;
    int num;
    Xuedi() {};//一个毫无用处的构造函数,嗯,对,就是你看到的这样
};
int main()
{
    int  n;
    cin >> n;
    while (n--)
    {
        int m;
        cin >> m;
        Xuedi* z = new Xuedi[m];//使用动态数组,在使用后释放,可以有效减少内存
        int ma = 0;//记录目前最多一条消息含有几个“ovo”
        for (int i = 0; i < m; i++)
        {
            string s, na;
            cin >> na >> s;
            int cnt = 0;
            for (int j = 0; j < s.length() - 2; j++)
            {
                if (s[j] == 'o' && s[j + 1] == 'v' && s[j + 2] == 'o')
                {
                    cnt++;
                }
            }
            /*
            也可以写作:
            for (int j = 0; j < s.length() - 2;)
            {
                int t = s.find("ovo",i);
                if(t == -1) break;
                else
                {
                    cnt ++; i = t + 1;
                }
            }
            */
            z[i].name = na;
            z[i].num = cnt;
            if (cnt >= ma)//如果该消息中“ovo”次数更多
            {
                ma = cnt;
            }
        }
        int x = 0;
        for (int i = 0; i < m; i++)
        {
            if (z[i].num == ma)
            {
                if (x++)cout << " ";
                cout << z[i].name;
            }
        }
        cout << endl << ma << endl;
        delete[]z;
    }
    return 0;
}

不知不觉又水完一个题解。好耶!

 

制作:BDT20040

posted @ 2021-03-20 23:22  流白李  阅读(74)  评论(0编辑  收藏  举报