PAT甲级1002

该题的容易出错的点:

  1. 格式问题:最后不要有空格;
  2. 输出问题:不要输出系数和为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]);
    }
} 

总结

  1. 为了简洁有时可适当放弃一些效率:相比柳神的代码,我的代码太过复杂了,其实根本没有必要使用链表记录应该输出的项,直接将数组遍历一遍即可。
  2. 几种将数组元素置零的方法
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;
posted @ 2021-03-31 15:25  刷书狂魔  阅读(60)  评论(0编辑  收藏  举报
总访问: counter for blog 次