zoukankan      html  css  js  c++  java
  • 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;
    
    CS专业在读,热爱编程。
    专业之外,喜欢阅读,尤爱哲学、金庸、马尔克斯。
  • 相关阅读:
    js5
    js4
    js(3)
    JS内容(2)
    html复习
    js介绍及内容(1)
    定位2
    position定位
    CSS
    列表及行块转变
  • 原文地址:https://www.cnblogs.com/jmhwsrr/p/14601677.html
Copyright © 2011-2022 走看看