2022.01.17

因为拿到电脑不久,所以从头开始;

今天重点学习优先排列,优先队列结构:

#include<iostream>
#include<queue>                           //优先队列需要调用的头文件
using namespace std;
int main()
{
    priority_queue<int,vector<int>,less<int> > name;  //可以根据需要来确定double等其他类型      que.size()                            //元素数量
    que.push()                          //元素插入
    que.pop()                           //元素删除
    que.top()                            //堆顶元素
    que.empty()                      //优先队列是否为
    return 0;
}

例题:

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

    在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。

    每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。

    因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。

例如有3种果子,数目依次为1,2,9。可以先将1、2堆合并,新堆数目为3,耗费体力为3。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为12。所以多多总共耗费体力=3+12=15。可以证明15为最小的体力耗费值。

输入描述:

输入包括两行,第一行是一个整数n(1<=n<=10000),表示果子的种类数。第二行包含n个整数,用空格分隔,第i个整数ai(1<=ai<=20000)是第i种果子的数目。 

输出描述:

输出包括一行,这一行只包含一个整数,也就是最小的体力耗费值。输入数据保证这个值小于231。

示例1

输入

3
1 2 9

输出

15

备注:

对于30%的数据,保证有n<=1000:
对于50%的数据,保证有n<=5000;
对于全部的数据,保证有n<=10000。

要点:这题是将数组中最小的两个元素相加,合成一个元素并整合到数组中,同时将原先的两个元素删除。

代码:

#include<bits/stdc++.h>

using namespace std;

int main()
{
    priority_queue<int, vector<int>,greater<int> >que;
    int n,a[100000],i;
    cin>>n;
    for(i=0;i<n;i++)
    {
        cin>>a[i];
        que.push(a[i]);
    }
    int num1,num2,sum=0,m;
    while(que.size()>1)
    {
        num1=que.top();               //最小的元素
        que.pop();                        //删除最小元素
        num2=que.top();               //第二小元素,
        que.pop();
        m=num1+num2;
        sum=sum+m;
        que.push(m);                    //重组数组
    }
    cout<<sum;
    return 0;
}

高精度乘法:

 当两个比较大的整数相乘时,可能会出现数据溢出的情形。为避免溢出,可以采用字符串的方法来实现两个大数之间的乘法。具体来说,首先以字符串的形式输入两个整数,每个整数的长度不会超过10位,然后把它们相乘的结果存储在另一个字符串当中(长度不会超过20位),最后把这个字符串打印出来。例如,假设用户输入为:62773417和12345678,则输出结果为:774980393241726.
  编写函数 void Multiply(char* s1, char* s2, char* result); 实现大数乘法(只考虑正整数),其中result = s1 * s2.
  编写main函数测试该函数的正确性.

输入:
  62773417 12345678

输出:
  774980393241726

题目简单,关键要处理位数之间的关系,如:十位乘以一个数和个位乘以一个数,它们所得的数不能从末尾开始相加,同理高位数也是如此。

代码:

#include<bits/stdc++.h>

using namespace std;
int main()
{
    char x[100],y[100];
    int a[100][100]={0},b[100]={0},i,j,num1=0,num2=0;
    cin>>x>>y;
    for(i=strlen(x)-1;i>=0;i--)
        a[0][num1++]=x[i]-'0';
    for(i=strlen(y)-1;i>=0;i--)
        b[num2++]=y[i]-'0';
    for(i=0;i<20;i++)
    {
        for(j=i;j<20;j++)
            a[i][j]=a[0][j-i];
    }
        int c=0,sum;
    for(i=0;i<20;i++)
    {
        for(j=i;j<20;j++)
        {
            sum=c+a[i][j]*b[i];
            a[i][j]=sum%10;
            c=sum/10;
        }
    }

    int f[21]={0};
    sum=0;
    for(i=0;i<20;i++)
    {
        for(j=0;j<20;j++)
            sum=sum+a[j][i];
        f[i]=sum%10;
        sum=sum/10;
    }
    for(i=20;i>=0;i--)
    {
        if(f[i]!=0)
        {
            for(j=i;j>=0;j--)
                cout<<f[j];
            break;
        }
    }
    return 0;
}
  预览图                         1   2   3
                             X       4   5   6
                      ——————————
                                      7   3   8
                                 6   1   5   0
                            4   1   9   0   0            注意对位

                   ———————————
                            5   6   0   8   8

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值