类的小小练习
写在前面:其实本次线上赛的题目实际上并不是一定要用类
我就小摸了下两道打卡题,下面这两个使用类的解法是后来搞的
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