1. 程式人生 > >【PAT-A】1002. A+B for Polynomials 寫題記錄

【PAT-A】1002. A+B for Polynomials 寫題記錄

思路:

第一次輸入原樣輸入,第二次輸入時,直接將相同指數的係數相加,並查詢有沒有已存在的指數,統計係數為0的個數。

因為佇列無法直接刪除係數為0的項,故0項最後輸出的時候再處理。

注意最後的格式

PS.題目有個瑕疵,未說明指數是否按降序輸入與輸出,因此最開始構思時想的是用優先佇列。

#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
const int MAXN = 1010;

int main(){
	int K1, K2, p=0;
	priority_queue<int> b;  //b存放指數 
	double a[MAXN] = {0};  //a存放係數 
	bool vis[MAXN] = {false};  //vis用於判斷指數是否重複出現 
	scanf("%d",&K1);
	for (int i=0; i<K1; i++){
		int n;
		double x;
		scanf("%d%lf",&n,&x);
		b.push(n);  //把n壓入優先佇列 
		a[n]=x;   //以指數為下標記錄係數 
		vis[n] = true;  //設定flag,true表示此指數已經出現 
	}
	scanf("%d",&K2);
	for (int i=0; i<K2; i++){
		int n;
		double x;
		scanf("%d%lf",&n,&x);
		a[n]+=x;  //係數先相加 
		if (vis[n] == false){  //判斷此指數是否重複出現,若未出現過 
			vis[n] = true;  //設定flag 
			b.push(n); //將指數壓入優先佇列 
		}
		if(a[n]==0){
			p++; 
		} 
	}
	int t=b.size();  //記錄此時共有多少個不同的指數  
	int q=1;
	if (t-p == 0){
		printf("0");
	}else printf("%d ",t-p); 
	for (int i=0;i<t;i++){
		if (a[b.top()]!=0){
			if (q<t-p) {
				printf("%d %.1f ",b.top(),a[b.top()]);  //依指數從大到小輸出指數與係數 
				q++;
			} else{
				printf("%d %.1f",b.top(),a[b.top()]);
			}		

		}	
		b.pop();		
	}
	/* 
	int t=b.size();  
	printf("%d",t-p); 
	for (int i=0;i<t;i++){
		if (a[b.top()]!=0){
			printf(" %d %.1f",b.top(),a[b.top()]);  
		}	
		b.pop();		
	}
	*/
	return 0;
}