题目地址: http://ac.jobdu.com/problem.php?pid=1472
题目描述:
输入两个多项式,计算它们的和。
每个多项式有若干对整数表示,每组整数中,第一个整数表示系数(非0),第二个整数表示该项的次数。
如由3 3 5 -2 1 4 0表示3x^5 - 2 * x + 4其中第一个3表示该多项式由三个整数对表示。
输入:
输入为两行,分别表示两个多项式。表示每项的整数对按照次数大小降序给出。(次数绝对值小于1000,系数绝对值小于10000)
输出:
按照降次顺序输出表示和多项式的整数对(系数为0的整数对不用输出,整数对由空格分隔,最后一个整数对后不添加空格)
样例输入:
3 3 5 -2 1 4 0
4 2 3 -1 2 1 1 3 0
样例输出:
3 5 2 3 -1 2 -1 1 7 0
来源:
2011年西北工业大学计算机研究生机试真题
【解题思路】
基本题,用不到什么算法。其实就是组成对的数据,次数相等相加,累加。
看了第一次的思路,是用map做的,其中key是次数,value是系数。
输入两组数据的时候就相加完毕了,最后按照要求输出。
再次看这个题目的时候,想到了数组,数组特别强大,因为一个是下标,一个是值。由于次数有可能为负数,题目说了,次数绝对值小于1000,所以每次输入的时候将次数+1000,值为系数。累加就是结果。
题目描述:
输入两个多项式,计算它们的和。
每个多项式有若干对整数表示,每组整数中,第一个整数表示系数(非0),第二个整数表示该项的次数。
如由3 3 5 -2 1 4 0表示3x^5 - 2 * x + 4其中第一个3表示该多项式由三个整数对表示。
输入:
输入为两行,分别表示两个多项式。表示每项的整数对按照次数大小降序给出。(次数绝对值小于1000,系数绝对值小于10000)
输出:
按照降次顺序输出表示和多项式的整数对(系数为0的整数对不用输出,整数对由空格分隔,最后一个整数对后不添加空格)
样例输入:
3 3 5 -2 1 4 0
4 2 3 -1 2 1 1 3 0
样例输出:
3 5 2 3 -1 2 -1 1 7 0
来源:
2011年西北工业大学计算机研究生机试真题
【解题思路】
基本题,用不到什么算法。其实就是组成对的数据,次数相等相加,累加。
看了第一次的思路,是用map做的,其中key是次数,value是系数。
输入两组数据的时候就相加完毕了,最后按照要求输出。
再次看这个题目的时候,想到了数组,数组特别强大,因为一个是下标,一个是值。由于次数有可能为负数,题目说了,次数绝对值小于1000,所以每次输入的时候将次数+1000,值为系数。累加就是结果。
Java map AC
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
public class Main {
/*
* 1472
*/
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
Map<Integer, Integer> numMap = new HashMap<Integer, Integer>();
int n1 = scanner.nextInt();
for (int i = 0; i < n1; i++) {
int ratioNum = scanner.nextInt();
int indexNum = scanner.nextInt();
int num = 0;
if (numMap.get(indexNum) != null) {
num = numMap.get(indexNum);
}
num += ratioNum;
numMap.put(indexNum, num);
}
int n2 = scanner.nextInt();
for (int i = 0; i < n2; i++) {
int ratioNum = scanner.nextInt();
int indexNum = scanner.nextInt();
int num = 0;
if (numMap.get(indexNum) != null) {
num = numMap.get(indexNum);
}
num += ratioNum;
numMap.put(indexNum, num);
}
Set<Integer> set = numMap.keySet();
int size = set.size();
int array[] = new int[size];
int index = 0;
for (Iterator iterator = set.iterator(); iterator.hasNext();) {
Integer integer = (Integer) iterator.next();
array[index] = integer;
index++;
}
Arrays.sort(array);
StringBuffer sb = new StringBuffer();
for (int i = size-1; i >= 0; i--) {
int rationNum = numMap.get(array[i]);
if (rationNum != 0) {
sb.append(rationNum+" "+array[i]+" ");
}
}
System.out.println(sb.toString().trim());
}
}
}
/**************************************************************
Problem: 1472
User: wzqwsrf
Language: Java
Result: Accepted
Time:400 ms
Memory:29052 kb
****************************************************************/
Java 数组 AC
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
public class Main {
/*
* 1472
*/
private static int maxn = 2002;
private static int addNum = 1000;
public static void main(String[] args) throws Exception{
StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
while (st.nextToken() != StreamTokenizer.TT_EOF) {
int indexArr[] = new int[maxn];
int n1 = (int)st.nval;
for (int i = 0; i < n1; i++) {
st.nextToken();
int ratioNum = (int)st.nval;
st.nextToken();
int indexNum = (int)st.nval;
indexArr[indexNum+addNum] += ratioNum;
}
st.nextToken();
int n2 = (int)st.nval;
for (int i = 0; i < n2; i++) {
st.nextToken();
int ratioNum = (int)st.nval;
st.nextToken();
int indexNum = (int)st.nval;
indexArr[indexNum+addNum] += ratioNum;
}
StringBuffer sb = new StringBuffer();
for (int i = maxn-1; i >= 0; i--) {
if (indexArr[i] != 0) {
sb.append(indexArr[i]+" "+(i - addNum)+" ");
}
}
System.out.println(sb.toString().trim());
}
}
}
/**************************************************************
Problem: 1472
User: wangzhenqing
Language: Java
Result: Accepted
Time:170 ms
Memory:24020 kb
****************************************************************/
C++ 数组 AC
#include <stdio.h>
#include <string.h>
const int maxn = 2002;
const int addNum = 1000;
int n,i,a,b;
int indexArr[maxn];
int main(){
while(scanf("%d",&n) != EOF){
memset(indexArr,0,sizeof(indexArr));
for(i = 0; i < n; i++){
scanf("%d %d",&a,&b);
indexArr[b+addNum] += a;
}
scanf("%d",&n);
for(i = 0; i < n; i++){
scanf("%d %d",&a,&b);
indexArr[b+addNum] += a;
}
int first = 1;
for(i = maxn-1; i >= 0; i--){
if(indexArr[i] != 0){
if(first == 1){
first = 2;
printf("%d %d",indexArr[i],i-addNum);
}else{
printf(" %d %d",indexArr[i],i-addNum);
}
}
}
printf("\n");
}
return 0;
}
/**************************************************************
Problem: 1472
User: wangzhenqing
Language: C++
Result: Accepted
Time:10 ms
Memory:1028 kb
****************************************************************/