10.30知识整理

1.车厢重组

描述

题目描述

在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转。一个车站的职工发现桥的长度最多能容纳两节车厢,如果将桥旋转180度,则可以把相邻两节车厢的位置交换,用这种方法可以重新排列车厢的顺序。于是他就负责用这座桥将进站的车厢按车厢号从小到大排列。他退休后,火车站决定将这一工作自动化,其中一项重要的工作是编一个程序,输入初始的车厢顺序,计算最少用多少步就能将车厢排序。

输入格式

共两行。

第一行是车厢总数N(N≤10000)。

第二行是N个不同的数表示初始的车厢顺序。

输出格式

一个整数,最少的旋转次数。

———————————————————————————————————————————

思路:这是要挨个交换就是冒泡排序

冒泡排序找最大数沉淀水底,因为比较最大数的时候最多有n-1个数比这个大(除了自己),之后

先要输入进来,之后每一次都会沉底一个大数,所以到第i轮就会沉底n-i个大数

但是如果我们要的是升序排列由低到高所以如果前面的比后面的要大就让他们两个交换一下位置即可,最后输出个数

———————————————————————————————————————————

代码实现

#include<iostream>
using namespace std;
int a[500010];
int main()
{
    int sum=0;
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        
    }
    for(int i=1;i<n;i++)
        {
            for(int j=1;j<=n-i;j++)
            {
            if(a[j]>a[j+1])
            {
                swap(a[j],a[j+1]);
                sum++;
            }
            }
        }
    cout<<sum;
}

———————————————————————————————————————————

2.高精度乘法

给定两个非负整数(不含前导 0) A 和 B,请你计算 A×B的值。

输入格式

共两行,第一行包含整数 A,第二行包含整数 B。

输出格式

共一行,包含 A×B的值。

数据范围

1≤A的长度≤100000
0≤B≤10000

————————————————————————————————————————

高精度乘法一般都是高精度数乘一个低精度数,还是像高

精度加法一样但是b不用定义数组来存储

只是一个变量来存储而已,所以还要定义一个c保存a*b的和,首先先要读入,读入到字符串里,之

后通过减去字符0来转化到数组逆序存储。在高精度乘法中也是可以在结尾用for循环来输出的,但

是这里还需要一部工作就是要去掉前导0,所以我们将去掉前导0和输出当作一个工作都放在write

函数但是他是不需要返回值的所以是void类型,在这里我们需要去掉前导0,有两个条件,先要判

断位数大于1还有要判断他到底是不是0,满足了这个关系之后让位数--,就去掉了前导0,之后再

main函数里面先要获取它的位数方便之后的进位,我们用一个for循环先初步处理进位跟之前的高

精度加法一样,之后while循环就是要再次判断他到底进没进位也就是说c[lc+1]!=0如果不等于零

就说明肯定是进位就需要让lc++,所以之后用write输出即可

——————————————————————————————————————————

代码呈现

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int a[N],c[N],b;
int la,lc;
int read(string s,int a[])
{
    int len=s.size();
    for(int i=1;i<=len;i++)
    {
        a[i]=s[len-i]-'0';
        
    }
    return len;
}
void write(int a[],int len)
{
    while(len>1&&a[len]==0)len--;
    for(int i=len;i>=1;i--)
    {
        cout<<a[i];
    }
}
int main()
{
    string s1;
    cin>>s1>>b;
    la=read(s1,a);
    lc=la;
    for(int i=1;i<=la;i++)
    {
        c[i]+=a[i]*b;
        c[i+1]+=c[i]/10;
        c[i]=c[i]%10;
    }
    while(c[lc+1]!=0)
    {
        lc++;
        c[lc+1]=c[lc]/10;
        c[lc]=c[lc]%10;
        
    }
    write(c,lc);
    return 0;
}

———————————————————————————————————————————

while循环只要不为0就是为0则是,所以再写while(c[lc+1]!=0)是可以写成while(c[lc+1])

———————————————————————————————————————————

排序

这边对sort来一个简单的总结(开始水了)

题目描述

学校正在选举学生会成员,有 (n≤999) 名候选人,每名候选人编号分别从 1 到 n,现在收集到了 m(m<=2000000)张选票,每张选票都写了一个候选人编号。现在想把这些堆积如山的选票按照投票数字从小到大排序。

输入格式

输入 n和 m 以及 m 个选票上的数字。

输出格式

求出排序后的选票编号。

输入输出样例

———————————————————————————————————————————

这一看就是对m个数字进行排序,因为题目中说了选票上写了候选人编号,要按照这个从小到大排序,如果从大到小就可以用reverse,这个用sort就不过多赘述

———————————————————————————————————————————

代码呈现

#include<iostream>
#include<algorithm>
using namespace std;
const int N=5000010;
int a[N];
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        cin>>a[i];
    }
    sort(a+1,a+m+1);
    for(int i=1;i<=m;i++)
    {
        cout<<a[i]<<" ";
    }
    return 0;
}

———————————————————————————————————————————

拜拜!别忘了给我打赏(某些人总是不自觉)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值