浙大PAT 甲级 1002题

题目

(这是题目链接)https://pintia.cn/problem-sets/994805342720868352/problems/994805526272000000

我的结题思路

分别申请两个动态数组表示两个多项式,然后建立一个静态数组,大小为20,表示结果多项式。然后开始加,加的时候,以一个为主,另一个循环遍历。最后对辅助的那个数组中没有处理的元素,加到结果数组里面。对于结果中的系数为0的项删除,最后对结果多项式按照指数降序排列输出。

#include <iostream>
using namespace std;
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main() {
	//k1,k2均表示非零的项数
	int k1 = 0;
	int k2 = 0;
	int k3 = 20;
	cin >> k1;
	if ((k1 < 1) || (k1 > 10)) return 0;   //输入的时候进行数据有效性判断。
	//申请动态数组,分别用于存储指数,系数,以及判断该项是否已经计算过了。
	int* A1;
	A1 = new int[k1];
	float* A2;
	A2 = new float[k1];
	//初始化
	for (int i = 0; i < k1; i++) {
		cin >> A1[i];
		if ((A1[i] < 0) || (A1[i] > 1000)) return 0;
		if ((i != 0) && (A1[i] > A1[i - 1])) return 0;
		cin >> A2[i];
	}
	//第二个多项式 同上。
	cin >> k2;
	if ((k2 < 1) || (k2 > 10)) return 0;
	int* B1;
	B1 = new int[k2];
	float* B2;
	B2 = new float[k2];
	bool* B3;
	B3 = new bool[k2];
	for (int i = 0; i < k2; i++) {
		cin >> B1[i];
		if ((B1[i] < 0) || (B1[i] > 1000)) return 0;
		if ((i != 0) && (B1[i] > B1[i - 1])) return 0;
		cin >> B2[i];
		B3[i] = false;
	}
	//存储结果多项式的指数和系数。
	int* C1;
	C1 = new int[k3];
	float* C2;
	C2 = new float[k3];

	//以下是判断的逻辑。
	int h1 = 0;
	for (int i = 0; i < k1; i++) {  //这个的逻辑是以第一个多项式为主,用第二个多项式的每一个与之比较。
		C1[h1] = A1[i];  //先就自己放入结果多项式。
		C2[h1] = A2[i];
		for (int j = 0; j < k2; j++) {  //指数相等,则系数相加。并置两者的访问为true.
			if (A1[i] == B1[j]) {
				C2[h1] = C2[h1] + B2[j];
				B3[j] = true;
			}
		}
		h1++;
	}
	for (int i = 0; i < k2; i++) {  //把第二个多项式中还没处理过的元素加入结果多项式。
		if (!B3[i]) {
			C1[h1] = B1[i];
			C2[h1] = B2[i];
			h1++;
		}
	}
    //系数为0的,删除。
		while(C2[0] == 0 && h1>1) {
			for (int g = 0; g < h1 - 1; g++) {
				C1[g] = C1[g + 1];
				C2[g] = C2[g + 1];
			}
			h1--;
		}
		if (h1 == 1 && C2[0] == 0) {
			cout << 0;
			return 0;
		}
	//最后这里是对结果数组,按照指数降序排列
	for (int i = 0; i < h1; i++) {       
		for (int j = i+1; j < h1; j++) {
			if (C1[j] > C1[i]) {
				int temp = C1[j];
				C1[j] = C1[i];
				C1[i] = temp;
				float temp1 = C2[j];
				C2[j] = C2[i];
				C2[i] = temp1;
			}
		}
	}
	cout << h1;
	for (int i = 0; i < h1 - 1; i++) {
		printf(" %d %.1f ", C1[i], C2[i]);
	}
	delete[]A1;
	delete[]A2;
	delete[]B1;
	delete[]B2;
	delete[]B3;
	delete[]C1;
	delete[]C2;
	return 0;
}

但是这样的话,会有一个测试点不通过,PAT还不给测试数据。不知道错在哪里。可有好友可以指点一二。

算法笔记的代码

#include <cstdio>
const int max_n = 1111;
double p[max_n] = {};
int main() {
	int k, n, count = 0;
	double a;
	scanf("%d", &k);
	for (int i = 0; i < k; i++) {
		scanf("%d %lf", &n, &a);
		p[n] += a;
	}
	scanf("%d", &k);
	for (int i = 0; i < k; i++) {
		scanf("%d %lf", &n, &a);
		p[n] += a;
	}
	for (int i = 0; i < max_n; i++) {
		if (p[i] != 0) {
			count++;
		}
	}
	printf("%d", count);
	for (int i = max_n - 1; i >= 0; i--) {
		if (p[i] != 0) printf(" %d %.1f", i, p[i]);
	}
	return 0;
}

看了之后,大为赞叹。写的很简洁,并且通过了所有的测试用例。分析了一下,他的代码牺牲了空间,获得了相对简洁的代码。并且充分利用了这道题的特点,即数组的元素个数最大值是可以确定的。以后做题要充分考虑题目已知的条件,方便写代码。

发布了27 篇原创文章 · 获赞 0 · 访问量 422

猜你喜欢

转载自blog.csdn.net/weixin_40007143/article/details/103827682