因为拿到电脑不久,所以从头开始;
今天重点学习优先排列,优先队列结构:
#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