东北林业大学 23ACM蓝桥杯训练 2 个人题解

前言:

  在家颓废了快一个星期了,在家里是真难有学习动力呀。希望自己能更加自律吧。

正文:

Problem:A 谁考了第k名-排序:

#include<bits/stdc++.h>
using namespace std;
typedef struct stu{
	int xh;
	double cj;	
}stu;
bool cmp1(stu a,stu b){
		return a.cj>b.cj;
	}
int main(){
	int n,k;
	stu a[109];
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>a[i].xh>>a[i].cj;
	}
	sort(a+1,a+1+n,cmp1);
	cout<<a[k].xh<<" "<<a[k].cj;
	return 0;
} 

这里用到了结构体排序与cmp函数,在这里简单介绍一下。结构体可以帮助我们将排序结果与其他相关属性关联起来。例如这题中的输出第k名学生的学号和成绩,我们可以将成绩和学号用结构体来关联起来再对结构体进行排序,就可以按成绩高低来输出各自的学号。这其中还需要运用cmp函数来定义sort函数的排序规则,通过返回值的真假来规定规则。具体用法见上述代码,下面的题目中也会经常用到。

Problem:B 奇数单增序列:

#include<bits/stdc++.h>
using namespace std;
int main(){
	vector<int> a;
	int n,x;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>x;
		if(x%2)a.push_back(x);
	}
	sort(a.begin(),a.end());
	for(vector<int>::iterator it=a.begin();it!=a.end();++it){
		if(it<a.end()-1)cout<<*it<<",";
		else cout<<*it;
	}
	return 0;
}

这里我用了vector,其实可以不这么麻烦开一个大于500的数组就行。vector的好处在于他的大小是动态的,这样就可以不用管N是多少了。遍历数组的时候记得排除偶数。

Problem:C 成绩排序:

#include<bits/stdc++.h>
using namespace std;
int main(){
	double a[12];
	while(cin>>a[1]>>a[2]>>a[3]>>a[4]>>a[5]>>a[6]>>a[7]>>a[8]>>a[9]>>a[10]){
		sort(a+1,a+11,greater<double>());
		for(int i=1;i<=10;i++){
			if(i<10)printf("%.2lf ",a[i]);
			else printf("%.2lf\n",a[i]);
		}
	}
	return 0;
}

sort默认升序排序,要想改变规则需要自己定义一个cmp函数或用greater<...>()来降序排序。

Problem:D 没必要的排序1

#include<bits/stdc++.h>
using namespace std;
int a[1009];
int main(){
	int n,k,ans=0;
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	sort(a+1,a+1+n,greater<int>());
	for(int i=1;i<=k;i++){
		ans+=a[i];
	}
	cout<<ans;
}

降序排序后将前k大的数加和。

Problem:E 没必要的排序2

#include<bits/stdc++.h>
using namespace std;
int a[100000];
int main(){
	int n,k,x,ans=0,cnt=0;
	ios::sync_with_stdio(false);
	cin>>n>>k;
	memset(a,0,sizeof(a));
	for(int i=1;i<=n;i++){
		cin>>x;
		a[x]++;
	}
	for(int i=100000;i>=1;i--){
		for(int j=1;j<=a[i];j++){
			ans+=i;
			cnt++;
			if(cnt==k)break;
		}
		if(cnt==k)break;
	}
	cout<<ans;
	return 0;
}

因为每个数最大不超过10000,用桶排序会方便很多,但也一定要取消同步流,不然会超时。

Problem:F 老和尚的导员:

#include<bits/stdc++.h>
using namespace std;
int a[109],b[109],c[109],d[109];
typedef struct stu{
	int xh,cj;
	int a,b,c,d;
}stu;
stu t[109];
bool cmp1(stu x,stu y){
	if(x.cj!=y.cj)
        return x.cj>y.cj;
    else if(x.a!=y.a)
        return x.a>y.a;
    else if(x.b!=y.b)
        return x.b>y.b;
    else if(x.c!=y.c)
        return x.c>y.c;
    else return x.d>y.d;
}
int main(){
	int n;
	while(scanf("%d",&n)!=EOF){
	memset(t,0,sizeof(t));
	for(int i=1;i<=n;i++){
		cin>>a[i]>>b[i]>>c[i]>>d[i];
		t[i].cj=a[i]+b[i]+c[i]+d[i];
		t[i].xh=i;
		t[i].a=a[i];
		t[i].b=b[i];
		t[i].c=c[i];
		t[i].d=d[i];
	}
	sort(t+1,t+1+n,cmp1);
	for(int i=1;i<=n;i++){
		cout<<t[i].xh<<" "<<t[i].cj<<endl;
	}}
	return 0;
}

结构体中的变量更多,cmp函数的规则也更复杂,不过万变不离其宗,依旧是一道普通的排序题。

Problem:G 健忘的老和尚:

#include<bits/stdc++.h>
using namespace std;
typedef struct stu{
	string name;
	int cj;	
}stu;
stu t[109];
bool cmp1(stu a,stu b){
	return a.cj<b.cj;
	}
int main(){
	int n;
	while(scanf("%d",&n)!=-1){
		int x,y;
		cin>>x>>y;
		for(int i=1;i<=n;i++){
			cin>>t[i].name>>t[i].cj;
		}
		sort(t+1,t+n+1,cmp1);
		for(int i=n-x+1;i<=n;i++){
			cout<<t[i].name<<endl;
		}
		for(int i=1;i<=y;i++){
			cout<<t[i].name<<endl;
		}
	}
	return 0;
}

注意排序后两个输出的都要求升序输出,调整for循环即可。

Problem:H 戏说三国:

#include <bits/stdc++.h>
using namespace std;
typedef struct stu{
	double zy,wy,dy,total;
	string name;
}stu;
stu wj[10009];
bool cmp1(stu x,stu y){
	if(x.total!=y.total) return x.total>y.total;
	else if(x.zy!=y.zy) return x.zy>y.zy;
	else if(x.dy!=y.dy) return x.dy>y.dy;
	else if(x.wy!=y.wy) return x.wy>y.wy;
}
int main(){
	int t;
	cin>>t;
	for(int i=1;i<=t;i++){
		int n;
		double a,b,c;
		cin>>n>>a>>b>>c;
		a/=100;b/=100;c/=100;
		for(int o=1;o<=n;o++){
			cin>>wj[o].name>>wj[o].zy>>wj[o].dy>>wj[o].wy;
			wj[o].total=wj[o].zy*b+wj[o].dy*a+wj[o].wy*c;
		}
		sort(wj+1,wj+n+1,cmp1);
		printf("Case #%d:\n",i);
		for(int p=1;p<=n;p++){
			cout<<wj[p].name<<" ";
			printf("%.4lf %.4lf %.4lf %.4lf\n",wj[p].total,wj[p].zy*b,wj[p].dy*a,wj[p].wy*c);
		}
	}
	return 0;
}

题目挺正常的,就是挖了一个大坑,总成绩是按b,a,c的比率计算的,别搞错为a,b,c了,我也掉进坑了,WA了好多次才发现,以后读题一定要认真了。

Problem:I 相约摩洛哥:

Problem:J 结构体排序题一:

#include<bits/stdc++.h>
using namespace std;
typedef struct stu
{
    char name[10];
    int t1,t2,t3;
    int s1,s2,s3;
    int sumtime;
    int actime;
}stu;
stu acm[100000];
bool cmp(stu a,stu b)
{
    if(a.actime==b.actime)
        return a.sumtime<b.sumtime;
        return a.actime>b.actime;
}
int main (void)
{
    int n,i,j;
    while(scanf("%d",&n)!=EOF)
    {
        for(i=0;i<n;i++)
        {
            cin>>acm[i].name>>acm[i].t1>>acm[i].t2>>acm[i].t3;
        }
        for(i=0;i<n;i++)
        {
            cin>>acm[i].s1>>acm[i].s2>>acm[i].s3;
            acm[i].actime=0;acm[i].sumtime=0;
        }
        for(i=0;i<n;i++)
        {
            if(acm[i].t1!=-1)acm[i].actime+=1;
            if(acm[i].t2!=-1)acm[i].actime+=1;
            if(acm[i].t3!=-1)acm[i].actime+=1;
        }
        for(i=0;i<n;i++)
        {
            if(acm[i].t1!=-1){acm[i].sumtime+=acm[i].t1+((acm[i].s1-1)*20);}
            if(acm[i].t2!=-1){acm[i].sumtime+=acm[i].t2+((acm[i].s2-1)*20);}
            if(acm[i].t3!=-1){acm[i].sumtime+=acm[i].t3+((acm[i].s3-1)*20);}
        }
        sort(acm,acm+n,cmp);
        for(j=0;j<n;j++)
        {
            cout<<acm[j].name<<" "<<acm[j].actime<<" "<<acm[j].sumtime<<endl;
        }
    }
    return 0;
}
#include<bits/stdc++.h>
using namespace std;
typedef struct stu{
	int x;
	int y;	
}stu;
stu a[100];
bool cmp00(stu a,stu b){
	if(a.x==b.x) return a.y>b.y;
	return a.x>b.x;
	}
bool cmp01(stu a,stu b){
	if(a.x==b.x) return a.y<b.y;
	return a.x>b.x;
	}
bool cmp11(stu a,stu b){
	if(a.x==b.x) return a.y<b.y;
	return a.x<b.x;
	}
bool cmp10(stu a,stu b){
	if(a.x==b.x) return a.y>b.y;
	return a.x<b.x;
	}
int main(){
	int o,p,n;
	while(cin>>o>>p>>n){
		for(int i =1;i<=n;i++){
			cin>>a[i].x>>a[i].y;
		}
		if(o==0){
			if(p==0)sort(a+1,a+n+1,cmp00);
			else sort(a+1,a+n+1,cmp01);
		}
		else{
			if(p==0)sort(a+1,a+n+1,cmp10);
			else sort(a+1,a+n+1,cmp11);
		}
		for(int i=1;i<=n;i++){
			cout<<"("<<a[i].x<<","<<a[i].y<<")"<<endl;
		}
	}
	return 0;
}

多定义几个cmp并按不同需求使用即可。

后记:

希望我在家也别懈怠学习啊。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值