强化阶段 Day 8 算法笔记 4.1 排序(2)

目录

1.List Sorting

2.The World's Richest

3.PAT Judge

4.List Grades

5.Graduate Admission


1.List Sorting

不能用等于号直接判断数组是否相等,要用strcmp函数

#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;

struct stu{
	int id;
	char name[10];
	int score;
}martix[100004];

int m;
bool cmp(stu a,stu b){
	if(m==1){
		return a.id<b.id;
	}else if(m==2){
		if(strcmp(a.name,b.name)!=0) return strcmp(a.name,b.name)<0;
		else return a.id<b.id;
	}else{
		if(a.score!=b.score) return a.score<b.score;
		else return a.id<b.id;
	}
}

int main(){
	
	int n;
	scanf("%d %d",&n,&m);
	for(int i=0;i<n;i++){
		scanf("%d %s %d",&martix[i].id,&martix[i].name,&martix[i].score);
	}
	
	sort(martix,martix+n,cmp);
	for(int i=0;i<n;i++){
		printf("%06d %s %d\n",martix[i].id,martix[i].name,martix[i].score);
	}
	
	return 0;
}

2.The World's Richest

这一题会有两个测试点超时。

如果进行下面这种预处理便可以避免

 

#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;

struct stu{
	char name[10];
	int age;
	int wealth;
}martix[100005];

bool cmp(stu a,stu b){
	return a.age<b.age;
}

bool cmp2(stu a,stu b){
	if(a.wealth!=b.wealth) return a.wealth>b.wealth;
	else if(a.age!=b.age) return a.age<b.age;
	else return strcmp(a.name,b.name)<0;
}

int main(){
	
	int n,m;
	scanf("%d %d",&n,&m);
	for(int i=0;i<n;i++){
		scanf("%s %d %d",&martix[i].name,&martix[i].age,&martix[i].wealth);
	}
	
	int num,start,end;
	for(int i=0;i<m;i++){
		sort(martix,martix+n,cmp);
		scanf("%d %d %d",&num,&start,&end);
		printf("Case #%d:\n",i+1);
		
		int l=0,r=n-1;
		while(martix[l].age<start){
			l++;
		}
		while(martix[r].age>end){
			r--;
		}
		if(l>r){
			printf("None\n");
			continue;
		}
		sort(martix+l,martix+r+1,cmp2);
		if(num>r-l+1) num=r-l+1;
		for(int j=l;j<l+num;j++){
			printf("%s %d %d\n",martix[j].name,martix[j].age,martix[j].wealth);
		}
	}
	
	return 0;
}

3.PAT Judge

#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;

struct stu{
	int id;
	bool flag=false;
	int get[6]={-1,-1,-1,-1,-1,-1};
	int man=0;
	int rank;
	int whol=0;
}martix[10005];

int score[5],k;
bool cmp(stu a,stu b){
	if(a.flag!=b.flag) return a.flag>b.flag;
	else if(a.whol!=b.whol) return a.whol>b.whol;
	else if(a.man!=b.man) return a.man>b.man;
	else if(a.id!=b.id) return a.id<b.id;
}

int main(){
	
	int n,m;
	scanf("%d %d %d",&n,&k,&m);
	for(int i=1;i<=k;i++){
		scanf("%d",&score[i]);
	}
	int name,q,s;
	for(int i=0;i<m;i++){
		scanf("%d %d %d",&name,&q,&s);
		if(s!=-1) martix[name].flag=true;
		if(s==-1&&martix[name].get[q]==-1) martix[name].get[q] = 0;
		if(s==score[q]&&martix[name].get[q]!=s) martix[name].man+=1;
		if(martix[name].get[q]<s) martix[name].get[q] = s;
	}
	for(int i=1;i<=n;i++){
		martix[i].id=i;
		for(int j=1;j<=k;j++){
			if(martix[i].get[j]!=-1){
				martix[i].whol+=martix[i].get[j];
			}
		}
	}
	sort(martix+1,martix+n+1,cmp);
	martix[1].rank=1;
	for(int i=2;i<=n;i++){
		if(martix[i].whol==martix[i-1].whol) martix[i].rank=martix[i-1].rank;
		else martix[i].rank=i;
	}
	for(int i=1;i<=n;i++){
		printf("%d %05d %d ",martix[i].rank,martix[i].id,martix[i].whol);
		for(int j=1;j<=k;j++){
			if(martix[i].get[j]==-1){
				printf("-");
			}else{
				printf("%d",martix[i].get[j]);
			}
			if(j!=k){
				printf(" ");
			}
		}
		if(martix[i+1].flag==false){
			break;
		}
		printf("\n");
	}
	return 0;
}

4.List Grades

#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;

struct stu{
	char name[12];
	char id[12];
	int score;
}martix[100005];

bool cmp(stu a,stu b){
	return a.score>b.score;
}

int main(){
	
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%s %s %d",&martix[i].name,&martix[i].id,&martix[i].score);
	}
	sort(martix,martix+n,cmp);
	
	int start,end;
	scanf("%d %d",&start,&end);
	int l=0,r=n-1;
	while(martix[l].score>end){
		l++;
	}
	while(martix[r].score<start){
		r--;
	}
	if(l>r){
		printf("NONE\n");
	}else{
		for(int i=l;i<=r;i++){
			printf("%s %s\n",martix[i].name,martix[i].id);
		}
	}
	
	
	return 0;
}

5.Graduate Admission

30分只能那22分

第一,我没有算排名,是临时判断的

第二,每个学校的录取人数,最后一个录取的,真正录取的人数,其实是好几个属性,可以用一个结构体将他们包括起来,不用像我那样临时判断

下次刷的时候再追求满分了

#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;

struct stu{
	int id;
	int ge;
	int gi;
	int final;
	int dream_school[5];
}martix[40005];

bool cmp(stu a,stu b){
	if(a.final!=b.final) return a.final>b.final;
	else if(a.ge!=b.ge) return a.ge>b.ge;
}

bool cmp1(int a,int b){
	return a<b;
}

int main(){
	
	int n,m,k;
	scanf("%d %d %d",&n,&m,&k);
	int school[100];
	for(int i=0;i<m;i++){
		scanf("%d",&school[i]);
	}
	for(int i=0;i<n;i++){
		martix[i].id=i;
		scanf("%d %d",&martix[i].ge,&martix[i].gi);
		martix[i].final = martix[i].ge+martix[i].gi;
		for(int j=0;j<k;j++){
			scanf("%d",&martix[i].dream_school[j]);
		}
	}
	sort(martix,martix+n,cmp);
	
	int admiss[100][4000];
	int num[100]={0};
	int temp,last;
	for(int i=0;i<n;i++){
		for(int j=0;j<k;j++){
			temp = martix[i].dream_school[j];
			if(school[temp]==0) continue;
			if(num[temp]<school[temp]){
				admiss[temp][num[temp]]=martix[i].id;
				num[temp]++;
				break;
			}else{
				last=admiss[temp][num[temp]-1];
				if(martix[i].final==martix[last].final&&martix[i].ge==martix[last].ge){
					admiss[temp][num[temp]] = martix[i].id;
					num[temp]++;
					break;
				}
			}
		}
	}
	
	for(int i=0;i<m;i++){
		sort(admiss[i],admiss[i]+num[i],cmp1);
		for(int j=0;j<num[i];j++){
			printf("%d",admiss[i][j]);
			if(j!=num[i]-1) printf(" ");
		}
		if(i!=m-1) printf("\n");
	}
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值