【PAT-A】1002. A+B for Polynomials 寫題記錄
阿新 • • 發佈:2018-12-20
思路:
第一次輸入原樣輸入,第二次輸入時,直接將相同指數的係數相加,並查詢有沒有已存在的指數,統計係數為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; }