一些排序的题

这篇博客包含了多个算法实例,包括车厢重组的冒泡排序、奶牛取书的查找算法、奖学金的多条件排序及选取、欢乐的跳判断序列是否为jolly跳跃序列,以及挑选志愿者的阈值筛选。通过这些例子,深入理解了排序和搜索在不同场景下的应用。
摘要由CSDN通过智能技术生成

车厢重组

#include<bits/stdc++.h>
using namespace std;
int n,ans=0,d;
int shu[10005];
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&d); 
        shu[i]=d;
    }
    for(int i=n-1;i>=1;i--)  //  这个从n-1开始,因为有n-1个循环
    {
        for(int j=1;j<=i;j++)  //这里是小于i,因为一开始要swap的次数多,后面慢慢减少
        {
            if(shu[j]>shu[j+1])
            {
                swap(shu[j],shu[j+1]);  //  冒泡排序
                ans++;
            }
        }
    }
    printf("%d",ans);
    return 0;
}

---------------------------------------------------------------------------------------------------------------------------------

奶牛取书

#include<bits/stdc++.h>
using namespace std;
int n,b,h,ans=1;
int shu[20005];
int main()
{
    scanf("%d%d",&n,&b);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&h);
        shu[i]=h;
    }
    sort(shu,shu+n); 
    for(int j=n-1;j>=0;j--)
    {
        if(shu[j]>=b)
        {
            printf("%d",ans);
            break;
        }
        else 
        {
            ans++;
            b-=shu[j];  //  一个一个比较,比较完在b里减去比较过的就行了
        }
    }
    return 0;
}

---------------------------------------------------------------------------------------------------------------------------------

奖学金

#include<bits/stdc++.h>
using namespace std;
const int N=305;
int n,a,b,c,he;
int yu[N],shu[N],ying[N],zong[N],hao[N];
struct pack  //  这里主要关注用结构体帮助排序
{
    int yu,zong,hao;
};
pack y[N];   //  这里定义y为一个pack类型的变量
bool cmp(pack a,pack b)  //  自定义cmp排序方法,注意a写在前面就会排在前面
{
    if(a.yu==b.yu&&a.zong==b.zong) return a.hao<b.hao;
    else if(a.zong==b.zong) return a.yu>b.yu;
    else return a.zong>b.zong;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d%d",&a,&b,&c);
        yu[i]=a;
        shu[i]=b;
        ying[i]=c;
        hao[i]=i;
        he=a+b+c;
        zong[i]=he;
        y[i].hao=hao[i];  //  这样就可以存进结构体里啦,y后面先写中括号里的内容,再写变量名
        y[i].zong=zong[i];
        y[i].yu=yu[i];
    }
    sort(y+1,y+n+1,cmp);  //注意加一,因为数组是从1开始的,根据sort左闭右开的原则,y加完n还要加1
    for(int i=1;i<=5;i++)
    {
        printf("%d %d\n",y[i].hao,y[i].zong);   //  输出记得换行
    }
    return 0;
}

---------------------------------------------------------------------------------------------------------------------------------

欢乐的跳

#include<bits/stdc++.h>
using namespace std;
const int N=1005;
int n,x,c,ans=0;
int shu[2*N],cha[2*N],d[N];
int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&x);
        shu[i]=x;
    }
    for(int i=0;i<n-1;i++)
    {
        c=abs(shu[i]-shu[i+1]);
        cha[i]=c;
    }
    sort(cha,cha+n-1);
    for(int i=0;i<n-1;i++)
    {
        d[i]=i+1;
    }
    for(int i=0;i<n-1;i++)
    {
        if(cha[i]==d[i]) ans++;   //  把差排完序再与1到n-1范围内的整数按顺序比较,有一个相等结果就加一,如果结果等于n-1即符合条件。
    }
    if(ans==n-1) printf("Jolly");
    else printf("Not jolly");
    return 0;
}

---------------------------------------------------------------------------------------------------------------------------------

挑选志愿者,入围面试

#include<bits/stdc++.h>
using namespace std;
const int N=10005;
int n,m,kk,ss,rw,ans=0;
int k[N],s[N];
struct pack  //  这里也用结构体帮助排序
{
    int k,s;
};
pack y[N];
bool cmp(pack a,pack b)
{
    if(a.s==b.s) return a.k<b.k;  //  注意排序方式了
    else return a.s>b.s; 
}
int main()
{
    scanf("%d%d",&n,&m);
    m=m*1.5;
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d",&kk,&ss);
        k[i]=kk;
        s[i]=ss;
        y[i].k=k[i];
        y[i].s=s[i];
    }
    //puts("qqqqq");
    sort(y+1,y+n+1,cmp);   //  这里y+n也要+1,因为需要的数组从一开始
    rw=y[m].s;
    for(int i=1;i<=n;i++)
    {
        if(y[i].s>=rw) ans++;
    }
    printf("%d %d\n",rw,ans);
    for(int i=1;i<=n;i++)
    {
        if(y[i].s>=rw) printf("%d %d\n",y[i].k,y[i].s);
    }
    return 0;
}

---------------------------------------------------------------------------------------------------------------------------------

明明的随机数

#include<bits/stdc++.h>
using namespace std;
int n,shu,q=-1,ans=0;
int x[1005];
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)  //有n个数要处理,典型的桶排啦
    {
        scanf("%d",&shu);
        x[shu]++;   //  该数的数量加一
        q=max(shu,q);   //  q一直都是出现过的数里最大的数
        if(x[shu]==1) ans++;   //统计有多少个不重复的数,所以只有出现一次时结果加1
    }
    printf("%d\n",ans);
    for(int i=1;i<=q;i++)  //  一直判断到最大的数就停
    {
        if(x[i]>=1)    printf("%d ",i);  //  求不重复的数,所以输出一次就好了
    }
    return 0;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值