题目
1009 Product of Polynomials (25 point(s))
This time, you are supposed to find A×B where A and B are two polynomials.
Input Specification:
Each input file contains one test case. Each case occupies 2 lines, and each line contains the information of a polynomial:
K N1 aN1 N2 aN2 ... NK aNK
where K is the number of nonzero terms in the polynomial, Ni and aNi (i=1,2,⋯,K) are the exponents and coefficients, respectively. It is given that 1≤K≤10, 0≤NK<⋯<N2<N1≤1000.
Output Specification:
For each test case you should output the product of A and B in one line, with the same format as the input. Notice that there must be NO extra space at the end of each line. Please be accurate up to 1 decimal place.
Sample Input:
2 1 2.4 0 3.2 2 2 1.5 1 0.5
Sample Output:
3 3 3.6 2 6.0 1 1.6
这道题的意思是让两个多项式相乘。
做这道题的时候我吸取前面的教训,直接用的数组。就是按照数学中怎么多项式相乘的。
#include<cstdio> #include<cstring> int main() { double a[1001], b[1001], c[2001];//分别存多项式指数以及系数 int n, temp_N; memset(a, 0, 1001 * sizeof(double)); memset(b, 0, 1001 * sizeof(double)); memset(c, 0, 2001 * sizeof(double)); double temp_aN; scanf("%d", &n); while (n--) { scanf("%d %lf", &temp_N, &temp_aN); a[temp_N] = temp_aN; } scanf("%d", &n); while (n--) { scanf("%d%lf", &temp_N, &temp_aN); b[temp_N] = temp_aN; } //相乘 for (int i = 0;i < 1001;i++) { for (int j = 0;j < 1001;j++) { c[i + j] += a[i] * b[j]; } } //数数有几项 int count = 0; for (int i = 2000;i >=0;i--) { if (c[i] != 0) count++; } printf("%d", count); for (int i = 2000;i >= 0;i--) { if (c[i] != 0) printf(" %d %.1lf",i,c[i]); } return 0; }
我感觉挺复杂的。遍历了所有元素。
不过。。。牛客和PATOJ都过了,也没说超时。
我看了书上的答案后,他的比我的简单,他是在输入第二个多项式的同时,嵌套一个循环去相乘。
其他的都差不多。还是得活学活用呀。
1041 考试座位号 (15 point(s))
每个 PAT 考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位。正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座位就座。但有些考生迟到了,试机已经结束,他们只能拿着领到的试机座位号码求助于你,从后台查出他们的考试座位号码。
输入格式:
输入第一行给出一个正整数 N(≤1000),随后 N 行,每行给出一个考生的信息:
准考证号 试机座位号 考试座位号
。其中准考证号
由 14 位数字组成,座位从 1 到 N 编号。输入保证每个人的准考证号都不同,并且任何时候都不会把两个人分配到同一个座位上。考生信息之后,给出一个正整数 M(≤N),随后一行中给出 M 个待查询的试机座位号码,以空格分隔。
输出格式:
对应每个需要查询的试机座位号码,在一行中输出对应考生的准考证号和考试座位号码,中间用 1 个空格分隔。
输入样例:
4 10120150912233 2 4 10120150912119 4 1 10120150912126 1 3 10120150912002 3 2 2 3 4
输出样例:
10120150912002 2 10120150912119 1
1 #include<cstdio> 2 struct Student { 3 long long ID; 4 int tryNum; 5 int examNum; 6 }data[1001]; 7 int main() { 8 int n,m,i; 9 scanf("%d", &n); 10 for (i = 0;i < n;i++) scanf("%lld%ld%ld", &data[i].ID, &data[i].tryNum, &data[i].examNum); 11 scanf("%d", &m); 12 for (i = 0;i < m;i++) { 13 int find_tryNum; 14 scanf("%d", &find_tryNum); 15 for (int j = 0;j < n;j++) { 16 if (data[j].tryNum == find_tryNum) printf("%lld %d ", data[j].ID, data[j].examNum); 17 } 18 } 19 return 0; 20 }
这道题很简单。但我看了教材的算法之后,发现可以直接令结构体的下标为试机座位。不用遍历一下去找了。
笨死了。
1004 成绩排名 (20 point(s))
读入 n(>0)名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。
输入格式:
每个测试输入包含 1 个测试用例,格式为
第 1 行:正整数 n 第 2 行:第 1 个学生的姓名 学号 成绩 第 3 行:第 2 个学生的姓名 学号 成绩 ... ... ... 第 n+1 行:第 n 个学生的姓名 学号 成绩
其中
姓名
和学号
均为不超过 10 个字符的字符串,成绩为 0 到 100 之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的。输出格式:
对每个测试用例输出 2 行,第 1 行是成绩最高学生的姓名和学号,第 2 行是成绩最低学生的姓名和学号,字符串间有 1 空格。
输入样例:
3 Joe Math990112 89 Mike CS991301 100 Mary EE990830 95
输出样例:
Mike CS991301 Joe Math990112
#include<cstdio> #include<cstring> int main(){ char max_name[11],min_name[11],max_ID[11],min_ID[11],temp_name[11],temp_ID[11]; int n,max_score=0, min_score=100,temp_score; scanf("%d", &n); while (n--) { scanf("%s%s%d", temp_name, temp_ID, &temp_score); if (temp_score > max_score) { max_score = temp_score; strcpy(max_name, temp_name); strcpy(max_ID, temp_ID); } if (temp_score < min_score) { min_score = temp_score; strcpy(min_name, temp_name); strcpy(min_ID, temp_ID); } } printf("%s %s ", max_name, max_ID); printf("%s %s ", min_name, min_ID); return 0; }
这个我为啥没想到用结构体。。。那么傻的建立了那么多字符数组,唉。。。。