PAT甲级刷题笔记(C++)
Hello!朋友们俺也来写博客啦~
最近在开始刷PAT的甲级真题,欢迎大噶一起来讨论还有互相监督刷题吖~后面也会陆续更新更多题目的刷题思路和完整代码!让我们冲冲冲吖!
- 写在前面:既然赶路,那便认真赶路
1002 A+B for Polynomials(多项式合并及排序)
(1)题目
- 英语原题
(2)代码和注释
- 实现方式①【部分正确】
优点:无需提前分配多余的存储空间
缺点:代码量长
#include<iostream>
#include<cstdio>
#include<cmath>
#include<vector>
#include <algorithm>
using namespace std;
int k1, k2, j=0, i=1, result_count=0, flag;
float tmp_float;
vector<int> num1;
vector<float> num2;
vector<int> result1;
vector<float> result2;
void bubble(vector<int>& result1, vector<float>& result2, int result_count)
{
for(int pass=1; pass<result_count; pass++)
{
flag=1;
for(i=0;i<result_count-pass;i++)
{
if(result1[i]<result1[i+1])
{
j=result1[i];
result1[i]=result1[i+1];
result1[i+1]=j;
tmp_float=result2[i];
result2[i]=result2[i+1];
result2[i+1]=tmp_float;
flag=0;
}
}
if(flag) break;
}
}
int main()
{
cin>>k1;
while(cin>>tmp_float)
{
if(i || j==2*k1)
{
if(j==2*k1)
{
k2=tmp_float;
i=1;
}
else
{
num1.push_back(tmp_float);
i=0;
}
}
else
{
num2.push_back(tmp_float);
i=1;
}
j++;
}
for(i=0;i<k1;i++)
{
flag=1;
for(j=0;j<k2;j++)
{
if(num1[i]==num1[k1+j])
{
result1.push_back(num1[i]);
result2.push_back(num2[i]+num2[k1+j]);
result_count++;
flag=0;
break;
}
}
if(flag)
{
result1.push_back(num1[i]);
result2.push_back(num2[i]);
result_count++;
}
}
flag=0;
for(j=0;j<k2;j++)
{
for(i=0;i<result_count;i++)
{
if(num1[k1+j]!=result1[i])
{
flag++;
continue;
}
}
if(flag==result_count)
{
result1.push_back(num1[k1+j]);
result2.push_back(num2[k1+j]);
result_count++;
}
}
flag=1;
bubble(result1,result2,result_count);
cout << result_count;
for(i=0;i<result_count;i++)
{
cout <<' '<< result1[i] <<' '<< result2[i];
}
// debug信息显示 (vector对未赋值的区域在显示时会自动置0)
// vector<int>::iterator it;
// for (it=num1.begin();it!=num1.end();it++)
// cout<<*it<<endl;
// for (i=0;i<4;i++)
// cout<<num2[i]<<endl;
// for (i=0;i<4;i++)
// cout<<num1[i]<<endl;
// debug信息显示 (vector对未赋值的区域在显示时会自动置0)
return 0;
}
- 实现方式②【全部正确】
优点:将指数作为位置信息,系数作为数组对应位置的值,则多项式合并变为对应位置数值相加
缺点:需要初始化一个很大空间的数组,因为指数的范围为(0,1000)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn = 1e3+100;
int n, cnt, id;
float a[maxn], val;
int main(){
for(int i = 1; i <= 2; i++){
scanf("%d", &n);
for(int j = 1; j <= n; j++){
scanf("%d%f", &id, &val);
//if(a[id]==0) cnt++;
a[id] += val;
}
}
for(int i = 0; i < maxn; i++)
if(a[i]!=0) cnt++;
printf("%d", cnt);
for(int i = 1000; i >= 0; i--){
if(a[i]!=0) printf(" %d %.1f", i, a[i]);
}
}
(3)参考的其他大哥的链接
- 写在后面:关关难过,关关过~