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.
For each test case you should output the sum 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 to 1 decimal place.
2 1 2.4 0 3.2<br/>2 2 1.5 1 0.5
3 2 1.5 1 2.9 0 3.2
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int count = 0; int n1 = sc.nextInt(); // 上限1000 double[] res = new double[1001]; for (int i = 0; i < n1; i++) { res[sc.nextInt()] = sc.nextDouble(); } int n2 = sc.nextInt(); for (int i = 0; i < n2; i++) { res[sc.nextInt()] += sc.nextDouble(); } for (int i = 0; i < 1000; i++) { if (res[i] != 0) count++; } System.out.print(count); for (int i = 999; i >= 0; i--) { if (res[i] != 0) System.out.printf(" %d %.1f", i, res[i]); } } }
package go.jacob.day921; import java.util.Iterator; import java.util.Map; import java.util.Scanner; import java.util.Stack; import java.util.TreeMap; public class Demo1 { public static void main(String[] args) { Scanner sc=new Scanner(System.in); Map<Integer,Double> map=new TreeMap<Integer,Double>(); int n=sc.nextInt(); for(int i=0;i<n;i++){ map.put(sc.nextInt(), sc.nextDouble()); } n=sc.nextInt(); for(int i=0;i<n;i++){ int exp=sc.nextInt(); if(map.containsKey(exp)){ map.put(exp, map.get(exp)+sc.nextDouble()); }else{ map.put(exp, sc.nextDouble()); } //保证输出位数 map.put(exp, Math.round(map.get(exp)*10)/10.0); if(map.get(exp)==0) map.remove(exp); } Iterator<Integer> it=map.keySet().iterator(); Stack<Integer> stack=new Stack<Integer>(); while(it.hasNext()){ stack.push(it.next()); } System.out.print(map.size()); for(int i=0;i<map.size();i++){ System.out.print(" "+stack.peek()+" "+map.get(stack.pop())); } sc.close(); } }
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int k1=0,k2=0;
int count=0;
double []p=new double[10];
k1=in.nextInt();
for(int i=0;i<k1;i++)
{
int expon=in.nextInt();
float coef=in.nextFloat();
p[expon]=coef;
}
k2=in.nextInt();
for(int i=0;i<k2;i++)
{
int expon=in.nextInt();
float coef=in.nextFloat();
p[expon]+=coef;
}
for (int i = 0; i < p.length; i++) {
if(p[i]!=0){
count++;
}
}
System.out.print(count);
for (int i = p.length-1; i >=0; i--) {
if (p[i]!=0) {
System.out.printf(" %d %.1f",i,p[i]);
}
}
}
}
搞个大数组,数组下标是指数,内容为系数,就可以解决问题了#include <iostream> #include <memory.h> #include <vector> #include <iomanip> using namespace std; const int maxn = 1002; double a[maxn]; double b[maxn]; int main() { memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); int k1, k2; cin >> k1; for (int i = 0; i < k1; i++) { int n; double an; cin >> n >> an; a[n] = an; } cin >> k2; for (int i = 0; i< k2; i++) { int n; double an; cin >> n >> an; b[n] = an; } vector<pair<int, double> > ans; for (int i = maxn - 1; i >= 0; i--) { double sum = a[i] + b[i]; if (sum != 0) { ans.push_back(make_pair(i, sum)); } } cout << ans.size(); for (size_t i = 0; i < ans.size(); i++) { cout << " " << ans[i].first << " " << setiosflags(ios::fixed) << setprecision(1) << ans[i].second; } return 0; }
import java.util.*; class Number{ double exponents; double coefficients; public Number(double exponents,double coefficients){ this.exponents=exponents; this.coefficients=coefficients; } } public class Main{ public static void main(String[] args){ Scanner sc=new Scanner(System.in); HashMap<Double,Double> hashMap=new HashMap<Double,Double>(); int k=sc.nextInt(); for(int i=0;i<k;i++){ double n=sc.nextDouble(); double a=sc.nextDouble(); hashMap.put(n,a); } k=sc.nextInt(); for(int i=0;i<k;i++){ double n=sc.nextDouble(); double a=sc.nextDouble(); if(hashMap.get(n)==null){ hashMap.put(n,a); }else{ hashMap.put(n,hashMap.get(n)+a); } } ArrayList<Number> numbers=new ArrayList<Number>(); for(Double exponents:hashMap.keySet()){ Number number=new Number(exponents,hashMap.get(exponents)); numbers.add(number); } Collections.sort(numbers,new Comparator<Number>(){ public int compare(Number o1,Number o2){ if(o1.exponents>o2.exponents) return -1; else if(o1.exponents==o2.exponents) return 0; else return 1; } }); for(int i=0;i<numbers.size();i++){ if(numbers.get(i).coefficients==0){ numbers.remove(i); } } System.out.print(numbers.size()+" "); for(int i=0;i<numbers.size()-1;i++){ System.out.printf("%d %.1f ",(int)numbers.get(i).exponents,numbers.get(i).coefficients); } System.out.printf("%d %.1f ",(int)numbers.get(numbers.size()-1).exponents,numbers.get(numbers.size()-1).coefficients); } }
#include <cstdio> #include <vector> #include <iostream> #include <algorithm> using namespace std; struct Polynomials { int exponent; float coef; Polynomials() {} void read(){ cin >> exponent >> coef; } void show(){ printf(" %d %.1f", exponent, coef); } }; bool compare(Polynomials p1, Polynomials p2){ return p1.exponent > p2.exponent; } int main(){ int k; vector<Polynomials> v; scanf("%d", &k); while(k--){ Polynomials p; p.read(); v.push_back(p); } sort(v.begin(), v.end(), compare); scanf("%d", &k); while(k--){ auto iter = v.begin(); Polynomials p; p.read(); for(;iter!=v.end();iter++){ if(iter->exponent == p.exponent){ iter->coef += p.coef; if(iter->coef == 0){ v.erase(iter); break; } break; } } if(iter == v.end()) v.push_back(p); } sort(v.begin(), v.end(), compare); if(!v.size()) cout << 0 << endl; else{ cout << v.size(); for(unsigned int i=0;i<v.size();i++) v[i].show(); cout << endl; } return 0; }
//直接最后在一次循环的时候同时记录个数与数值 import java.text.DecimalFormat; import java.text.Format; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in=new Scanner(System.in); int m=in.nextInt(); float c[]=new float[1000]; for(int i=0;i<m;i++){ int g=in.nextInt(); c[g]+=in.nextFloat(); } int n=in.nextInt(); for(int i=0;i<n;i++){ int g=in.nextInt(); c[g]+=in.nextFloat(); } DecimalFormat f=new DecimalFormat("0.0"); int count=0; String s=""; for(int i=c.length-1;i>=0;i--){ if(c[i]!=0){ count++; s=s+" "+i+" "+f.format(c[i]); } } System.out.print(count+s); } }
#include<bits/stdc++.h> using namespace std; const int Max=1010; double p[Max]= {0}; int main() { int count=0; for(int i=0; i<2; i++) { int m; cin>>m; while(m--) { int a; double b; cin>>a>>b; p[a]+=b; } } for(int i=0; i<Max; i++) { if(p[i]!=0) { count++; } } cout<<count; for(int i=Max-1; i>=0; --i) { if(p[i]!=0) { printf(" %d %.1f",i,p[i]); } } return 0; }
#include <cstdio> #include<cstring> int main() { int maxSize = 1001; //最大幂次为1000+1 double k[maxSize]; //n表示幂次,k[n]表示对应系数 //double k[maxSize] = {0}错误,用变量定义数组长度不能初始化 memset(k,0,sizeof(k)); //用memset()函数来初始化 for (int i = 0; i < 2; i++) { int n; scanf("%d", &n); while (n--) { int a; double b; //a为幂次,b为系数 scanf("%d %lf", &a, &b); k[a] += b; } } int cout = 0; //记录新多项式的项数 for (int i = 0; i < maxSize; i++) { if (k[i] != 0) cout++; } printf("%d", cout); for (int i = maxSize - 1; i >= 0; i--) { //从最高幂往后排 if (k[i] != 0) printf(" %d %.1f", i, k[i]); } }
#include<iostream> using namespace std; int main(){ int ka,kb; int ma,mb,p; //ma,mb分别为A,B的最高次幂;p用来输入每次的指数 double q; //q用来输入每次的系数 int i; cin>>ka>>ma; double *a=new double[ma+1]{}; //存储A的系数 cin>>a[ma]; for(i=0;i<ka-1;i++){ cin>>p>>q; a[p]=q; } cin>>kb>>mb; double *b=new double[mb+1]{}; //存储B的系数 cin>>b[mb]; for(i=0;i<kb-1;i++){ cin>>p>>q; b[p]=q; } int size=ma>mb?ma+1:mb+1; double *sum=new double[size]{}; //存储A+B的和的系数 for(i=0;i<ma+1&&i<mb+1;i++) sum[i]=a[i]+b[i]; if(i<ma+1) for(int j=i;j<size;j++) sum[j]=a[j]; if(i<mb+1) for(int j=i;j<size;j++) sum[j]=b[j]; int count=0; for(i=size-1;i>=0;i--) //统计共多少个系数不为0的幂指数 if(sum[i]!=0) count++; cout<<count; for(i=size-1;i>=0;i--) if(sum[i]!=0) printf(" %d %.1f",i,sum[i]); //系数要保留一位小数 return 0; }
//多项式相加, 主要注意测试样例 输出后面小数点后面精度控制 #include<iomanip> #include<vector> #include <iostream> using namespace std; struct po { float exponent; float coefficient; po(float exponent1, float coefficient1) { exponent = exponent1; coefficient = coefficient1; } }; vector<po>a,b,c; int main() { int K1,K2; cin >> K1; float exponent, coefficient; for (int i = 0; i < K1; i++) { cin >> exponent >> coefficient; a.emplace_back(exponent, coefficient); } cin >> K2; for (int i = 0; i < K2; i++) { cin >> exponent >> coefficient; b.emplace_back(exponent, coefficient); } int i = 0, j = 0; while ( i < a.size() && j < b.size()) { if (a[i].exponent > b[j].exponent) { c.emplace_back(a[i]); i++; } else if (a[i].exponent < b[j].exponent) { c.emplace_back(b[j]); j++; } else { float sum = a[i].coefficient + b[j].coefficient; if (sum != 0) c.emplace_back(a[i].exponent, sum); i++; j++; } } while (i < a.size()) { c.emplace_back(a[i]); i++; } while (j < b.size()) { c.emplace_back(b[j]); j++; } int flag = 1; cout << c.size(); for (int k = 0; k < c.size(); k++) { cout << ' ' << fixed << setprecision(0)<< c[k].exponent; cout<< ' ' << fixed << setprecision(1) << c[k].coefficient; } return 0; }
import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner s=new Scanner(System.in); int n1=s.nextInt(); double[] d1=new double[1001]; double[] d2=new double[1001]; for(int i=0;i<n1;i++){ int index1=s.nextInt(); double a=s.nextDouble(); d1[index1]=a; } int n2=s.nextInt(); for(int j=0;j<n2;j++){ int index2=s.nextInt(); double b=s.nextDouble(); d2[index2]=b; } double[] d=new double[1001]; int count=0; String str=""; for(int k=0;k<1001;k++){ d[k]=d1[k]+d2[k]; if(d[k]!=0){ count++; str=" "+k+" "+d[k]+str; } } str=count+str; System.out.println(str); } }
import java.util.Scanner; public class Main { public static void main(String[] args) { final double EPS = 0.0001; Scanner in = new Scanner(System.in); float [] coefficients = new float[1001]; while(in.hasNext()){ int K = in.nextInt(); for(int i=0; i < K; i++){ int j = in.nextInt(); coefficients[j] = in.nextFloat(); } K = in.nextInt(); for(int i=0; i < K; i++){ int j = in.nextInt(); coefficients[j] += in.nextFloat(); } int count = 0; for(int i=coefficients.length-1;i>=0;i--){ if(!(-EPS<coefficients[i] && coefficients[i]<EPS)) count++; } System.out.print(count); for(int i=coefficients.length-1;i>=0;i--) { if (!(-EPS < coefficients[i] && coefficients[i] < EPS)) System.out.printf(" %d %.1f",i,coefficients[i]); } System.out.println(); } } }憨憨解法,直接开数组
a,b = input().split(),input().split() d = {} for i in range(1,len(a),2): c = eval(a[i]) d[c] = d[c] + eval(a[i + 1]) if c in d else eval(a[i + 1]) for i in range(1,len(b),2): c = eval(b[i]) d[c] = d[c] + eval(b[i + 1]) if c in d else eval(b[i + 1]) e = [str(len(d))] for i in sorted(d,reverse = True): if d[i]: e.append(str(i) + ' ' + '{:.1f}'.format(d[i])) else: e[0] = str(int(e[0]) - 1) print(' '.join(e))
#include <bits/stdc++.h> using namespace std; const int N = 1001; double a[N],b[N],c[N]; int main(){ int len1,len2,len3=0,x; double y; scanf("%d",&len1); for(int i = 1; i <= len1; i++) scanf("%d%lf",&x,&y),a[x] = y; scanf("%d",&len2); for(int i = 1; i <= len2; i++) scanf("%d%lf",&x,&y),b[x] = y; for(int i = 0; i < N; i++){ c[i] = a[i] + b[i]; if(c[i]) len3++; } printf("%d",len3); for(int i = N-1; i>=0; i--) if(c[i]) printf(" %d %.1f",i,c[i]); return 0; }
看是25分的题,扫了眼题目和输入输出就开始做了,出来看评论区才注意到这数据规模可以不用STL直接用数组模拟看起来简洁一点=。=,还是贡献一下自己丑陋的STL写法吧(因为题目比较短所以命名那些也乱飙了,为了做快点)
#include<iostream> #include<map> #include<cmath> #include<cstdlib> #include<vector> #include<utility> using namespace std; map<int,float> m; vector<pair<int,float> > v; int main() { for(int i=0;i<2;i++) { int k; scanf("%d",&k); for(int j=0;j<k;j++) { int n; float a; scanf("%d %f",&n,&a); m[n]+=a; } } for(map<int,float>::reverse_iterator it=m.rbegin();it!=m.rend();it++) { if(fabs((*it).second)>0.00001) v.push_back(*it); } printf("%d",v.size()); for(int i=0;i<v.size();i++) printf(" %d %.1f",v[i].first,v[i].second); return 0; }
#include <iostream> #include <iomanip> using namespace std; int main() { int K, max=0, t; float s; float a[1002]={0}; //初始化所有数组为0 //输入第一行 cin >> K; int count = K; //输出时有效项的个数 for (int i=0; i<K; i++) { cin >> t; cin >> a[t]; if (t>max) { max = t; } } //输入第二行,并加和 cin >> K; for (int i=0; i<K; i++) { cin >> t; cin >> s; if (t>max) { max = t; } if (a[t]==0) { count++; } a[t] += s; if (a[t]==0) { count--; //若该项的系数为0,则输出时可以省略 } } //输出 cout << count; for (int i=max; i>=0; i--) { if (a[i]!=0) { cout <<' '<< i <<' '<< fixed << setprecision(1) <<a[i]; //小数点后保留一位 } } return 0; }