笔试编程原题
1.提数排序
题目描述:
有一种排序算法定义如下,该排序算法每次只能把一个元素提到序列的开头,例如2,1,3,4,只需要一次操作把1提到序列起始位置就可以使得原序列从小到大有序。现在给你个乱序的1-n的排列,请你计算最少需要多少次操作才可以使得原序列从小到大有序。
输入描述
输入有n个正整数,表示序列中的n个元素,中间用空格隔开。(1<=a_i<=n)
输出描述
输出仅包含一个整数,表示最少的操作次数。
int main()
{
int a;
vector<int> v1;
vector<int> v2;
while(cin>>a)
{
v1.push_back(a);
v2.push_back(a);
if(cin.get()=='\n') break;
}
sort(v2.begin(),v2.end());
int len=v1.size();
int count=0;
int j=len-1;
for(int i=len-1;i>=0;i--)
{
//依次从后往前比较,先找到最大元素在v1中的位置,依次在最大前找次大的...
if(v2[j]==v1[i])
{
//i--;不能在加这句,因为for循环每次i都会--,如果加了,每次i会减去2;
j--;
count++;//统计找到的次数
}
}
int res=len-count;
cout<<res<<endl;
}
2.四边形面积
题目描述:
给出你n条长度不一的边,请你从中选择四条边,组成一个最大的平行四边形。请你输出最大的平行四边形的面积。
输入描述
输入第一行包含一个正整数n,表示边的数量。(4<=n<=50000)
输入第二行包含n个正整数,表示n条边的长度,边的长度不会超过10^9。
输出描述
输出仅包含一个正整数,即最大的平行四边形的面积,无解则输出-1。
**本题相对简单:**只需要找出最大的两两相等的四条边即可,然后将其相乘(长方形的面积计算方式);
变形扩展:
(1)求最大四边形面积:外接圆;
如果四条边可以构成四边形,则四条边之和大于2倍的最长边;
Sum=(a+b+c+d)/2.0;
area=sqrt((s-a)*(s-b)*(s-c)*(s-d));
(2)三角形面积求法
参考
double comarea(point A,point B,point C)
{
double x1=A.x-B.x;
double y1=A.y-B.y;
double x2=B.x-C.x;
double y2=B.y-C.y;
double area=(x1*y2-x2*y1)/2.0;
return area;
}
//判断时要用&&; ABC、ABP、BCP、ACP
3.各不相等(未AC)
题目描述:(待完善)
输入一个数组,将两相等的合并,直到出现每一个数都不相等;
例子:5 5 5 5 4 输出20 4
3 3 3 7 5 输出6 4 7 5;
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
vector<int> v1;
int a;
for(int i=0;i<n;i++)
{
cin>>a;
v1.push_back(a);
}//如果从后往前合并时,使用reverse函数反转v1;
vector<int>::iterator ite;
while(1)
{
int temp=v1.size();
for(auto it=v1.begin()+1;it!=v1.end();it++)
{
if(*it==*(it-1))
{
*(it-1)=(*it)*2;
it=v1.erase(it);
it--;
}
}
if(temp==v1.size())
break;
}
for(int i=0;i<v1.size();i++)
cout<<v1[i]<< " ";
cout<<endl;
}
return 0;
}
方法二:某AC过的代码
#include<bits/stdc++.h>
using namespace std; //typedef long long LL;
map<int,int> ids;
priority_queue<int,vector<int>,greater<int>> q[50010];
//q[50010]优先级队列数组:存放每种数出现的位置,从小到大
int ans[50010];//记录最终答案的位置,因为删除不会改变数字间的相对位置
priority_queue<int,vector<int>,greater<int>> nums;// 优先队列存放当前队列中出现的数,一种数只存一个
int main(){
int n;
cin>>n;
int a,idx=0;
for(int i=1;i<=n;++i){
cin>>a; //a[i]读取数
if(ids[a]==0){
ids[a]=++idx; //map:ids的键值为a[i], 实值为该数是第几个输入的不同值;
nums.push(a); //nums存放输入的不同的数;
}
q[ids[a]].push(i); //每一个数a优先级队列:其存放与a相同数的输入索引位置;
}
while(nums.size()){
int x=nums.top();
nums.pop();
while(q[ids[x]].size()>=2) {
q[ids[x