2020.1.1大一寒假集训二(桶排序与结构体排序)

A题 谁考了第K名

#include <bits/stdc++.h>
using namespace std;
struct stu
{
	int num;
	double x;
};
bool cmp(stu a,stu b)
{

    return a.x>b.x;
}
int main()
{
	stu a[100];
	int n,k;
	int i;
	while(~scanf("%d%d",&n,&k))
    {

        for(i=1;i<=n;i++)
            scanf("%d %lf",&a[i].num,&a[i].x);
       sort(a+1,a+n+1,cmp);
        printf("%d %g\n",a[k].num,a[k].x);
    }
	return 0;

}


B题 奇数单增序列

#include <bits/stdc++.h>
using namespace std;
int main()
{
     int n,i,a[510];
    while(scanf("%d",&n)!=-1)
    {
        for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
        sort(a+1,a+n+1);
        for(i=1;i<=n;i++)
        {
            if(a[i]%2==1)
            {
                if(i==1)printf("%d",a[i]);
                else printf(",%d",a[i]);
            }
        }
        printf("\n");
    }
    return 0;
}

C题 成绩排序

#include <bits/stdc++.h>
using namespace std;
struct node
{
    string name;
    int mark;
}p[21];
bool cmp(node a,node b)
{
    if(a.mark!=b.mark)return a.mark>b.mark;
    else return a.name<b.name;
}
int main()
{
    int i,n;
    cin>>n;
    for(i=0;i<n;i++)
    cin>>p[i].name>>p[i].mark;
    sort(p,p+n,cmp);
    for(i=0;i<=n-2;i++)
    printf("%s %d\n",p[i].name.c_str(),p[i].mark);
    printf("%s %d",p[n-1].name.c_str(),p[n-1].mark);
    return 0;
}

没必要的排序1

#include <bits/stdc++.h>
using namespace std;
int main()
{
	int n,k;
	int a[1000];
	int sum=0;
	int i;
	scanf("%d%d",&n,&k);
	for(i=1;i<=n;i++)
	scanf("%d",&a[i]);
	sort(a+1,a+1+n,greater<int>());
	for(i=1;i<=k;i++)
	sum+=a[i];
	printf("%d\n",sum);
	return 0;
 }

没必要的排序2

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e7+10;
const int maxk=1e5+10;
int t[maxk];// t[i] 为 i 这个数出现的次数
int main()
{
    ios::sync_with_stdio(false);
    int i,x,n,k,ans,num;
    cin>>n>>k;
    memset(t,0,sizeof(t));//计数之前初始化数组是个好习惯,这题只是单组输入,这行也可以省略
    for(i=1;i<=n;i++)
    {
        cin>>x;
        t[x]++;
    }
    num=ans=0;
    for(i=1e5;i>=1;i--)
    {
        if(t[i]>0)//如果有i这个数,那么i出现的次数t[i]>0,如果t[i]=0,没有这个数就不用再加上去了
        {
            ans=ans+t[i]*i;
            num=num+t[i];
        }
        if(num>=k)
        {
            ans=ans-(num-k)*i;//减去多加的值
            break;
        }
    }
    printf("%d\n",ans);
    return 0;
}

老和尚的导员

#include <bits/stdc++.h>

using namespace std;
struct student
{
    int a[5],s,k;
};
bool cmp(student m,student n)
{
    if(m.s!=n.s) return m.s>n.s;
    else if(m.a[1]!=n.a[1]) return m.a[1]>n.a[1];
    else if(m.a[2]!=n.a[2]) return m.a[2]>n.a[2];
    else if(m.a[3]!=n.a[3]) return m.a[3]>n.a[3];
    else if(m.a[4]!=n.a[4]) return m.a[4]>n.a[4];
}
int main()
{
    int i,n;
    student stu[200];
    while(scanf("%d",&n)!=-1)
    {
        for(i=1;i<=n;i++)
        {
            scanf("%d%d%d%d",&stu[i].a[1],&stu[i].a[2],&stu[i].a[3],&stu[i].a[4]);
            stu[i].s=stu[i].a[1]+stu[i].a[2]+stu[i].a[3]+stu[i].a[4];
            stu[i].k=i;
        }
        sort(stu+1,stu+n+1,cmp);
        for(i=1;i<=n;i++)
        printf("%d %d\n",stu[i].k,stu[i].s);
    }
    return 0;
}

健忘的老和尚

#include <bits/stdc++.h>

using namespace std;
struct student
{
    int a;
    char name[101];
};
bool cmp(student m,student n)
{return m.a<n.a;}
int main()
{
    int i,n,m,o;
    student p[200];
    while(scanf("%d%d%d",&n,&m,&o)!=-1)
    {
        for(i=1;i<=n;i++)
        scanf("%s%d",&p[i].name,&p[i].a);
        sort(p+1,p+n+1,cmp);
        for(i=n-m+1;i<=n;i++)
            printf("%s\n",p[i].name);
        for(i=1;i<=o;i++)
            printf("%s\n",p[i].name);
    }
    return 0;
}

戏说三国

#include <bits/stdc++.h>

using namespace std;
struct student
{
    char name[30];
    double x,y,z,x1,y1,z1;
    double s;
};
bool cmp(student m,student n)
{
    if(m.s!=n.s) return m.s>n.s;
    else if(m.x1!=n.x1) return m.x1>n.x1;
        else if(m.y1!=n.y1) return m.y1>n.y1;
    else if(m.z1!=n.z1) return m.z1>n.z1;

}
student p[100001];
int main()
{
    int t,n,i,I;
    double a,b,c;
    while(scanf("%d",&t)!=-1)
    {
        for(I=1;I<=t;I++)
        {
            scanf("%d%lf%lf%lf",&n,&a,&b,&c);
            for(i=1;i<=n;i++)
            {
                scanf("%s%lf%lf%lf",p[i].name,&p[i].x,&p[i].y,&p[i].z);
                p[i].x1=p[i].x*b*0.01;
                p[i].y1=p[i].y*a*0.01;
                p[i].z1=p[i].z*c*0.01;
                p[i].s=p[i].x1+p[i].y1+p[i].z1;
            }
            sort(p+1,p+n+1,cmp);
            printf("Case #%d:\n",I);
            for(i=1;i<=n;i++)
            printf("%s %.4lf %.4lf %.4lf %.4lf\n",p[i].name,p[i].s,p[i].x1,p[i].y1,p[i].z1);
        }
    }
    return 0;
}

相约摩洛哥

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
struct stu
{

    char name[10];
    int t[4],sub[4],tsum,ac;
}p[100001];
bool cmp(stu a,stu b)
{
    if(a.ac!=b.ac) return a.ac>b.ac;
    if(a.ac==b.ac) return a.tsum<b.tsum;
}
int main()
{
    int i,j,n;
    while(~scanf("%d",&n))
    {
        for(i=1;i<=n;i++)
            scanf("%s%d%d%d",p[i].name,&p[i].t[1],&p[i].t[2],&p[i].t[3]);
        for(i=1;i<=n;i++)
            scanf("%d%d%d",&p[i].sub[1],&p[i].sub[2],&p[i].sub[3]);
        for(i=1;i<=n;i++)
        {
            p[i].tsum=p[i].ac=0;
            for(j=1;j<=3;j++)
            {
                if(p[i].t[j]!=-1)
                {
                    p[i].ac++;
                    p[i].tsum+=p[i].t[j]+20*(p[i].sub[j]-1);
                }
            }
        }
        sort(p+1,p+1+n,cmp);
        for(i=1;i<=n;i++)
            printf("%s %d %d\n",p[i].name,p[i].ac,p[i].tsum);
    }
    return 0;
}

结构体排序题一


```cpp
#include <bits/stdc++.h>
using namespace std;
struct stu
{

    int x,y;

};
bool cmp1(stu a,stu b)
{
    if(a.x==b.x) return a.y<b.y;
    else return a.x<b.x;
}
bool cmp2(stu a,stu b)
{
    if(a.x==b.x) return a.y>b.y;
    else return a.x<b.x;
}
bool cmp3(stu a,stu b)
{
    if(a.x==b.x) return a.y<b.y;
    else return a.x>b.x;
}
bool cmp4(stu a,stu b)
{
    if(a.x==b.x) return a.y>b.y;
    else return a.x>b.x;
}
int main()
{
    int n,i,k1,k2;
    stu p[100];
    while(scanf("%d%d%d",&k1,&k2,&n)!=-1)
    {
        for(i=1;i<=n;i++)
        scanf("%d%d",&p[i].x,&p[i].y);
        if(k1==1&&k2==1)sort(p+1,p+n+1,cmp1);
        if(k1==1&&k2==0)sort(p+1,p+n+1,cmp2);
        if(k1==0&&k2==1)sort(p+1,p+n+1,cmp3);
        if(k1==0&&k2==0)sort(p+1,p+n+1,cmp4);
        for(i=1;i<=n;i++)
        printf("(%d,%d)\n",p[i].x,p[i].y);
    }
  return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值