1002 A+B for Polynomials (25分)

1⃣️map.size()是ensign long型,用%lu输出
2⃣️保留小数后一位,是%.1lf,不是%lf.1
3⃣️答案错误,有时候是运行时间问题?
4⃣️关于浮点数的比较,本题没有用到相关测试点,用宏定义和eps或者直接用==都可以。
5⃣️测试点六没过是因为当多项式相加为0时,依旧进去了输出循环,导致段错误,加一个特判即可
6⃣️测试点2运行超时,但这时间复杂度不久O(m+n)吗,咋回事儿呢?突然想到是不是同一个多项式存在没化简?得有O(M*N)
7⃣️auto很好用,map<int,double>::iterator it1=vn.begin()可以直接改成 auto it1=vn.begin();

#include<iostream>
#include<map>
using namespace std;
const double eps=1e-8;
//#define Equ(a,b) (fabs((a)-(b))<(eps))
#define Mor(a,b) ((a)-(b)>(eps))//与Les定义一个就可以
#define Les(a,b) ((a)-(b)<(-eps))
map<int,double> vn,vm,sum;
void init(map<int,double> &vn)
{
    int n,temp1;
    double temp2;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&temp1);
        scanf("%lf",&temp2);
        vn[temp1]=temp2;
    }
}
int main()
{
   init(vn);
   init(vm);
   map<int,double>::iterator it1=vn.begin(),it2=vm.begin();
    while(it1!=vn.end()||it2!=vm.end())
    {
        if(it1==vn.end())
        {
            sum[it2->first]=it2->second;
            it2++;
        }
        else if(it2==vn.end())
        {
            sum[it1->first]=it1->second;
            it1++;
        }
        else
        {
        if(Mor(it1->first,it2->first))
        {
            sum[it2->first]=it2->second;
            it2++;
        }
        else if(Les(it1->first,it2->first))
        {
            sum[it1->first]=it1->second;
            it1++;
        }
        else
        {
            double total;
            total=it1->second+it2->second;
            if(total!=0)
                sum[it1->first]=total;
            it1++;
            it2++;
        }
        }
    }
    if(sum.size()!=0)
    {
    printf("%lu",sum.size());
    map<int,double>::iterator it=sum.end();
    it--;
    for(;;it--)
    {
        printf(" %d %.1lf",it->first,it->second);
        if(it==sum.begin())
            break;
    }
    }
    else
        printf("0\n");
    return 0;
}

大佬说我的思维混乱,不应该用map,应该用静态数组,修改后:

#include<iostream>
#include<map>
using namespace std;
//#define Equ(a,b) (fabs((a)-(b))<(eps))
//#define Mor(a,b) ((a)-(b)>(eps))//与Les定义一个就可以
//#define Les(a,b) ((a)-(b)<(-eps))
map<int,double> vn,vm,sum;
void init(map<int,double> &vn)
{
    int n,temp1;
    double temp2;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&temp1);
        scanf("%lf",&temp2);
        if (vn.find(temp1) != vn.end())
            vn[temp1]+=temp2;
        else
            vn[temp1] = temp2;
    }
}
int main()
{
   init(vn);
   init(vm);
   map<int,double>::iterator it1=vn.begin(),it2=vm.begin();
    while(it1!=vn.end()||it2!=vm.end())
    {
        if (it1 != vn.end())
        {
            int x = it1->first;
            if (sum.find(x) != sum.end())
                sum[x] += it1->second;
            else
                sum[x] = it1->second;
            it1++;
        }
        if (it2 != vm.end())
        {
            int x = it2->first;
            if (sum.find(x) != sum.end())
                sum[x] += it2->second;
            else
                sum[x] = it2->second;
            it2++;
        }
    }
    int sz = 0;
    map<int,double>::iterator it=sum.end();
    for(;;it--)
    {
        if (it->second != 0)
            sz++;
        if (it == sum.begin())
            break;
    }
    printf("%d", sz);
    it=sum.end();
    for(;;it--)
    {
        if (it->second != 0)
            printf(" %d %.1f",it->first,it->second);
        if (it == sum.begin())
            break;
    }
    printf("\n");
    return 0;
}
#include <iostream>
#include <iomanip>
#include <map>
using namespace std;
map<int, double> hashx;
void inHash(int lineSize,int n) {
	for (int i = 0; i < lineSize; i++) {
		int mi;
		double val;
		cin >> mi >> val;
		hashx[mi] += val;   //完成第一个数组的初始化
		if (n == 2 && hashx[mi]==0) {
		    hashx.erase(mi);
		}
	}
}
以下是借鉴别人的map方法,
int main() {
	int line;
	cin >> line;
	inHash(line,1);
	cin >> line;
	inHash(line,2);
	cout << hashx.size();
	for (auto i = hashx.rbegin(); i != hashx.rend(); i++) {
		if (i->second != 0) {
		    cout << " "<<fixed << setprecision(1) << i->first << ' ' << fixed << setprecision(1) << i->second;
		}
	}
}

想的太复杂了,不用第三个容器来计算和,直接往第一个容器加就完事,为零就erase掉就行,iomanip是输入输出格式控制,setprecision(1)是浮点数精确到小数点后一位。

二刷:
就是一个二元组,还是对齐相加的,直接一个hash就实现了!!!不知不觉我变聪明了!

#include<bits/stdc++.h>
using namespace std;
double hash1[1001]={0};
int main(){
    int k,e,count=0;
    cin>>k;
    for(int i=0;i<k;i++)
        cin>>e>>hash1[e];
    cin>>k;
    for(int i=0;i<k;i++){
        double temp;
        cin>>e>>temp;
        hash1[e]+=temp;
    }
    for(int i=0;i<1001;i++){
        if(hash1[i]!=0)
            count++;
    }
    cout<<count;
    for(int i=1001;i>=0;i--){
        if(hash1[i]!=0){
            printf(" %d %.1lf",i,hash1[i]);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值