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;
}