Content-Length: 244347 | pFad | https://jhon107.blog.csdn.net/article/details/107655511

编程笔试题解析:排序、几何与算法挑战-CSDN博客

集合篇8:笔试编程原题

本文收集了一系列编程笔试题目,包括提数排序、四边形面积计算、数组处理等。涵盖了动态规划、回溯法、字符串操作等多种算法,旨在帮助读者提升算法能力和解决实际问题的技巧。
摘要由CSDN通过智能技术生成

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
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值








ApplySandwichStrip

pFad - (p)hone/(F)rame/(a)nonymizer/(d)eclutterfier!      Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

Fetched URL: https://jhon107.blog.csdn.net/article/details/107655511

Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy