PAT甲级1002
该题的容易出错的点:
- 格式问题:最后不要有空格;
- 输出问题:不要输出系数和为0的项;
代码实现:
我的代码(及其臃肿):
#include<iostream>
#include<vector>
#include<cstring>
#include<climits>
using namespace std;
typedef struct Node {
int exp;
Node *next;
} Node;
// 我的方法:
// 1. 使用非常大的数组来保存系数,其下标为对应项的系数
// 2. 使用一个链表来保存已有的项,按降序排列
// 3. 输出的时候,避开系数之和为0的项
int main() {
vector<double> v(1000, 0); // 下标为对应项的系数
Node *head = new Node;
int n1, n2, exp;
double coe;
while (cin >> n1) {
head->next = nullptr;
int cnt = 0;
for(int i = 0; i < n1; i++) {
cin >> exp >> coe;
v[exp] += coe;
if (v[exp] == 0 && coe != 0) // 如果某项的系数之和为0了,则不应输出它,因此cnt--
cnt--;
Node *p = head;
while (p->next != nullptr && p->next->exp > exp) p = p->next;
if (p->next != nullptr && p->next->exp == exp) continue; // 如果当前项已存在,便不再建立新的节点
cnt++;
Node *q = new Node; // 建立新节点
q->exp = exp;
q->next = p->next;
p->next = q;
}
cin >> n2;
for(int i = 0; i < n2; i++) { // 同上
cin >> exp >> coe;
v[exp] += coe;
if (v[exp] == 0 && coe != 0)
cnt--;
Node *p = head;
while (p->next != nullptr && p->next->exp > exp) p = p->next;
if (p->next != nullptr && p->next->exp == exp) continue;
cnt++;
Node *q = new Node;
q->exp = exp;
q->next = p->next;
p->next = q;
}
Node *q;
Node *p = head->next;
cout << cnt;
while(p != nullptr) {
if (v[p->exp] != 0.0) // 不输出系数和为0的项
printf(" %d %.1lf", p->exp, v[p->exp]);
q = p;
p = p->next;
delete q;
}
memset(&v[0], 0, v.size() * sizeof v[0]); // 将数组值0
}
}
柳神的代码
// 柳神的方法
int main(){
float c[1001] = {0};
int m, n, t;
float num;
scanf("%d", &m);
for(int i = 0; i < m; i++){
scanf("%d%f", &t, &num);
c[t] += num;
}
scanf("%d", &n);
for (int i = 0; i < n; i++){
scanf("%d%f", &t, &num);
c[t] += num;
}
int cnt = 0;
for(int i = 0; i < 1001; i++){
if (c[i] != 0) cnt++;
}
printf("%d", cnt);
for (int i = 1000; i >= 0; i--){
if (c[i] != 0)
printf(" %d %.1f", i, c[i]);
}
}
总结
- 为了简洁有时可适当放弃一些效率:相比柳神的代码,我的代码太过复杂了,其实根本没有必要使用链表记录应该输出的项,直接将数组遍历一遍即可。
- 几种将数组元素置零的方法:
int v[100];
// 法一(包含于cstring中)
memset(&v[0], 0, v.size() * sizeof v[0]);
// 法二(仅适用于vector)
std::fill(v.begin(), v.end(), 0);
// 法三(仅适用于vector)
v.assign(v.size(),0);
// 法四
for(int i = 0; i < size; i++)
v[i] = 0;
CS专业在读,热爱编程。
专业之外,喜欢阅读,尤爱哲学、金庸、马尔克斯。
专业之外,喜欢阅读,尤爱哲学、金庸、马尔克斯。