总结:自己二叉树写蒙圈了,pta答案网上良莠不齐,所以我选择跟着算法笔记刷,这两天写了不少简单题,今天写了5个简单模拟题,最后的日期差值还有问题没有解决;
我们就先看日期差值这题吧,我想的是用第一个日期的总天数减去第二个日期的总天数,在牛客网上全通过了,但是在codeup上显示错误,尚未找到错误的地方;
还值得一提的是,因为我考虑到多组输入,应该需要把输入改为while...EOF,但是在vs2022中需要输入三次ctrl+z才能到eof,还没有弄清楚为什么。
先展示我的思路:
#include<iostream>
using namespace std;
bool is_leap_yr(int y) {
if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0) {
return 1;
}
return 0;
}
int sum_day(int y, int m, int d) {
int sum = 0;
int month[13] = {0, 31,28,31,30,31,30,31,31,30,31,30,31 };//从1月开始,下标0不算
if (is_leap_yr(y)) {
month[2] += 1;
}
sum += (y * 365 + y / 4 - y / 100 + y / 400);
for (int i = 1; i <= m-1; i++) {//月份是1-->m-1,m不算
sum += month[i];
}
return sum + d;
}
int main() {
int y1, m1, d1, y2, m2, d2;
scanf("%4d%2d%2d", &y1, &m1, &d1);
scanf("%4d%2d%2d", &y2, &m2, &d2);
int sum1 = sum_day(y1, m1, d1);
int sum2 = sum_day(y2, m2, d2);
if (sum1 >= sum2) {
cout << sum1 - sum2 + 1;
}
else {
cout << sum2 - sum1 + 1;
}
return 0;
}
再展示算法笔记中的思路,使用的是ans变量从第一个日期慢慢加到第二个日期,得出的答案,值得参考,但是我没采用的原因是:如果两个日期差距很大,循环次数会非常多。
第二题:题目详情 - 1022 D进制的A+B (pintia.cn)
#include<iostream>
#include<vector>
using namespace std;
int main() {
//10-->m进制数,可能超过int范围,选择用数组保存后逆序输出
vector<int>v;
int a, b, m;
cin >> a >> b >> m;
int sum = a + b;
do {//sum一开始为0时可以用do...while循环
v.push_back(sum % m);
sum /= m;
} while (sum);
for (vector<int>::iterator i = v.end() - 1; i != v.begin(); i--) {
cout << *i;
}
cout << *(v.begin());
return 0;
}
第三个是:题目详情 - 1032 挖掘机技术哪家强 (pintia.cn)
这题我感觉我的做法比答案要好一些,因为是输入的for循环中就找到了答案
#include<iostream>
using namespace std;
int main() {
int n;
cin >> n;
//注意是n+1(因为可能是第n个学校),列表初始化
int* sum = new int[n+1] {0};
int maximum = 1,info,score;
for (int i = 0; i < n; i++) {
cin >> info >> score;
sum[info] += score;
if (sum[maximum] < sum[info]) {
maximum = info;
}
}
cout << maximum << ' ' << sum[maximum];
delete[]sum;
return 0;
}
第四个是:题目详情 - 1036 跟奥巴马一起编程 (pintia.cn)
这一题答案选择直接打印,空间复杂度比我用二维数组储存要好很多。
#include<iostream>
using namespace std;
//对比算法笔记,他选择直接打印,没有使用数组储存,空间复杂度更好;
int main() {
int n;
char c;
cin >> n >> c;
char arr[11][21];
int row = n % 2 == 0 ? n/2 : n / 2 + 1;//注意奇数要四舍五入,即+1
for (int i = 0; i < row; i++) {
for (int j = 0; j < n; j++) {
if (i == 0 || i == row-1||j==0||j==n-1) {
arr[i][j] = c;
}
else {
arr[i][j] = ' ';
}
}
}
for (int i = 0; i < row; i++) {
for (int j = 0; j < n; j++) {
cout << arr[i][j];
}
cout << endl;
}
return 0;
}