大一寒假集训2020.1.1 //结构体排序,桶排序

2020.1.1 大一寒假集训

结构体排序

谁考了第k名-排序

使用sort函数快排结构体。

#include<bits/stdc++.h>
using namespace std;
struct student
{
    char id[10];
    double score;
};
struct student a[100];
bool cmp(student a,student b)
{
    if(a.score>b.score)
       {
           return true;
       }
    return false;
}
int main()
{
    int n,k;
    cin>>n>>k;
    for(int i=0;i<n;i++)
    {
        cin>>a[i].id>>a[i].score;
    }
    sort(a,a+n,cmp);
    cout<<a[k-1].id<<" ";
    printf("%g\n",a[k-1].score);
    return 0;
}

奇数单增序列

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a[501];
    int N;
    cin>>N;
    for(int i=0;i<N;i++)
    {
        cin>>a[i];
    }
    sort(a,a+N);
    for(int i=0;i<N;i++)
    {
        if(a[i]%2!=0)
        {
            if(i!=N-2)
            {
                cout<<a[i]<<",";
            }
            else
            {
                cout<<a[i];
            }
        }
    }
    cout<<endl;
    return 0;
}

成绩排序

#include<bits/stdc++.h>
using namespace std;
struct student
{
    char name[20];
    int score;
};
struct student a[30];
bool cmp2(student a,student b)
{
    if(a.score!=b.score)
    {
        return a.score>b.score;
    }
    else
    {
        return a.name<b.name;
    }
}
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>a[i].name>>a[i].score;
    }
    sort(a,a+n,cmp2);
    for(int i=0;i<n;i++)
    {
        cout<<a[i].name<<" "<<a[i].score<<endl;
    }
    return 0;
}

没必要的排序1

#include<bits/stdc++.h>
using namespace std;
bool cmp3(int a,int b)
{
    return a>b;
}
int main()
{
    int n,k;
    int a[1000]={0};
    cin>>n>>k;
    int sum=0;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }
    sort(a,a+n,cmp3);
    for(int i=0;i<k;i++)
    {
        sum=sum+a[i];
    }
    cout<<sum<<endl;
    return 0;
}

老和尚的导员

#include<bits/stdc++.h>
using namespace std;
struct he
{
    int c;
    int gs;
    int xd;
    int eng;
    int sum;
    int id;
};
bool cmp1(he a,he b)
{
    if(a.sum!=b.sum)
    {
        return a.sum>b.sum;
    }
    else if(a.sum==b.sum)
    {
        if(a.c!=b.c)
        {
            return a.c>b.c;
        }
        else if(a.c==b.c)
        {
            if(a.xd!=b.xd)
            {
                return a.xd>b.xd;
            }
            else if(a.xd==b.xd)
            {
                if(a.gs!=b.gs)
                {
                    return a.gs>b.gs;
                }
                else if(a.gs==b.gs)
                {
                    if(a.eng!=b.eng)
                    {
                        return a.eng>b.eng;
                    }
                    else
                    {
                        return a.id<b.id;
                    }
                }
            }
        }
    }
}
struct he a[100];
int main()
{
    int n;
    while(cin>>n)
    {
        memset(a,0,sizeof(a));
        for(int i=0; i<n; i++)
        {
            cin>>a[i].c>>a[i].xd>>a[i].gs>>a[i].eng;
            a[i].id=i+1;
        }
        for(int i=0; i<n; i++)
        {
            a[i].sum=a[i].c+a[i].gs+a[i].xd+a[i].eng;
        }
        sort(a,a+n,cmp1);
        for(int i=0; i<n; i++)
        {
            cout<<a[i].id<<" "<<a[i].sum<<endl;
        }
    }

    return 0;
}

健忘的老和尚

#include<bits/stdc++.h>
using namespace std;
struct shang
{
    char name[105];
    int sum;
};
bool comp(shang a,shang b)
{
    if(a.sum!=b.sum)
    {
        return a.sum>b.sum;
    }
}
bool comp2(shang a,shang b)
{
    if(a.sum!=b.sum)
    {
        return a.sum<b.sum;
    }
}
int main()
{
    int M,N,O;
    cin>>N>>M>>O;
    struct shang a[N];
    for(int i=0;i<N;i++)
    {
        cin>>a[i].name>>a[i].sum;
    }
    sort(a,a+N,comp);
    for(int i=0;i<M;i++)
    {
        sort(a,a+M,comp2);
        cout<<a[i].name<<endl;
    }
    sort(a,a+N,comp2);
    for(int i=0;i<O;i++)
    {
        cout<<a[i].name<<endl;
    }
    return 0;
}

戏说三国

这题有坑,看他给的对应关系。

#include<bits/stdc++.h>
using namespace std;
struct sg
{
    int dy;
    int zy;
    int wy;
    double sum;
    char name[100];
};
bool cmp1(sg a,sg b)
{
    if(a.sum!=b.sum)
    {
        return a.sum>b.sum;
    }
    else if(a.sum==b.sum)
    {
        if(a.zy!=b.zy)
        {
            return a.zy>b.zy;
        }
        else if(a.zy==b.zy)
        {
            if(a.dy!=b.dy)
            {
                return a.dy>b.dy;
            }
            else if(a.dy==b.dy)
            {
                return a.wy>b.wy;
            }
        }
    }
}
struct sg a[100005];
int main()
{
    memset(a,0,sizeof(a));
    int t;
    cin>>t;
    for(int j=0;j<t;j++)
    {
        int n;
        cin>>n;
        double x,y,z;
        cin>>x>>y>>z;
        x=x*0.01;
        y=y*0.01;
        z=z*0.01;
        for(int i=0; i<n; i++)
        {
            cin>>a[i].name>>a[i].zy>>a[i].dy>>a[i].wy;
        }
        for(int i=0; i<n; i++)
        {
            a[i].sum=a[i].zy*y+a[i].dy*x+a[i].wy*z;
        }
        sort(a,a+n,cmp1);
        cout<<"Case"<<" "<<"#"<<j+1<<":"<<endl;
        for(int i=0; i<n; i++)
        {
            cout<<a[i].name<<" ";
            printf("%.4f %.4f %.4f %.4f\n",a[i].sum,a[i].zy*y,a[i].dy*x,a[i].wy*z);
        }
    }
    return 0;
}

相约摩洛哥

没A出来的题不算罚时,然后判断要写!=-1.

#include<bits/stdc++.h>
using namespace std;
struct acm
{
    char name[20];
    int aca,acat;
    int acb,acbt;
    int acc,acct;
    int sum;
    int counter;
};
struct acm a[100005];
bool px(const acm a,const acm b)
{
    if(a.counter!=b.counter)
    {
        return a.counter>b.counter;
    }
    else if(a.counter==b.counter)
    {
        return a.sum<b.sum;
    }
}
int main()
{
    int n;
    while(cin>>n)
    {
        memset(a,0,sizeof(a));
        for(int i=0; i<n; i++)
        {
            cin>>a[i].name>>a[i].aca>>a[i].acb>>a[i].acc;
        }
        for(int i=0; i<n; i++)
        {
            cin>>a[i].acat>>a[i].acbt>>a[i].acct;
        }
        for(int i=0; i<n; i++)
        {
            if(a[i].aca!=-1)
            {
                a[i].counter++;
                a[i].sum=a[i].aca+(a[i].acat-1)*20+a[i].sum;
            }
            else if(a[i].aca==-1)
            {
                a[i].sum=a[i].sum;
            }
            if(a[i].acb!=-1)
            {
                a[i].counter++;
                a[i].sum=a[i].acb+(a[i].acbt-1)*20+a[i].sum;
            }
            else if(a[i].acb==-1)
            {
                a[i].sum=a[i].sum;
            }
            if(a[i].acc!=-1)
            {
                a[i].counter++;
                a[i].sum=a[i].acc+(a[i].acct-1)*20+a[i].sum;
            }
            else if(a[i].acc==-1)
            {
                a[i].sum=a[i].sum;
            }
        }
        sort(a,a+n,px);
        for(int i=0; i<n; i++)
        {
            cout<<a[i].name<<" "<<a[i].counter<<" "<<a[i].sum<<endl;
        }
    }
    return 0;
}

结构体排序题一

#include<bits/stdc++.h>
using namespace std;
struct point
{
    int x;
    int y;
};
bool px1(const point a,const point b)
{
    if(a.x!=b.x)
    {
        return a.x>b.x;
    }
    else if(a.x==b.x)
    {
        return a.y<b.y;
    }
}
bool px2(const point a,const point b)
{
    if(a.x!=b.x)
    {
        return a.x>b.x;
    }
    else if(a.x==b.x)
    {
        return a.y>b.y;
    }
}
bool px3(const point a,const point b)
{
    if(a.x!=b.x)
    {
        return a.x<b.x;
    }
    else if(a.x==b.x)
    {
        return a.y>b.y;
    }
}
bool px4(const point a,const point b)
{
    if(a.x!=b.x)
    {
        return a.x<b.x;
    }
    else if(a.x==b.x)
    {
        return a.y<b.y;
    }
}
struct point a[100];
int main()
{
    int n;
    int q,w;
    while(cin>>q>>w)
    {
        memset(a,0,sizeof(a));
        cin>>n;
        for(int i=0; i<n; i++)
        {
            cin>>a[i].x>>a[i].y;
        }
        if(q==0&&w==0)
        {
            sort(a,a+n,px2);
        }
        else if(q==0&&w==1)
        {
            sort(a,a+n,px1);
        }
        else if(q==1&&w==0)
        {
            sort(a,a+n,px3);
        }
        else if(q==1&&w==1)
        {
            sort(a,a+n,px4);
        }
        for(int i=0; i<n; i++)
        {
            cout<<'('<<a[i].x<<','<<a[i].y<<')'<<endl;
        }
    }

    return 0;
}

桶排序

没必要的排序2

上面的升级版,普通排序会超时;

#include<bits/stdc++.h>
using namespace std;
int a[100005];
int main()
{
    int n,k,t;
    cin>>n>>k;
    memset(a,0,sizeof(a));
    long long sum=0;
    for(int i=1;i<=n;i++)
    {
        cin>>t;
        a[t]++;
    }
    for(int i=100000,j=0;i>0;i--)
    {
        while(a[i]--&&k>0)       //把桶中的数拿出来加到和里,同时满足桶中有数,还有拿的次数。
        {                        //我上铺的大佬教的。
            sum=sum+i;
            k--;
        }
    }
    cout<<sum<<endl;
    return 0;
}

第二天成功AC,蒟蒻在成长。
过几天专门写一个初级的结构体排序。

发布了7 篇原创文章 · 获赞 0 · 访问量 1320

猜你喜欢

转载自blog.csdn.net/qq_34212975/article/details/103795373
今日推荐