暑期集训sort

点击打开链接


A题:开门人和关门人

简单的结构体排序。。

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
struct people
{
	char num[20];
	int come;
	int out;
}an[5000];
bool cmp1(people a,people b)
{
	return a.come<b.come;
}
bool cmp2(people a,people b)
{	
	return a.out>b.out;
}
int main()
{
	int n,m,i;
	scanf("%d",&n);
	while(n--){		
		scanf("%d",&m);
		for(i=0;i<m;i++){
			int h,m,s;
			scanf("%s",an[i].num);
			scanf("%d:%d:%d",&h,&m,&s);
			an[i].come=h*3600+m*60+s;
			scanf("%d:%d:%d",&h,&m,&s);
			an[i].out=h*3600+m*60+s;
		}
		sort(an,an+m,cmp1);
		printf("%s ",an[0].num);
		sort(an,an+m,cmp2);
		printf("%s\n",an[0].num);
	}
return 0;
}
B题: excel排序

就是考虑每一种排序方法的要求

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
struct student
{
	char num[10];
	char name[10];
	int grade;
}p[100010];
bool cmp1(student a,student b)
{
	int t=strcmp(a.num,b.num);
	if(t==-1)
		return true;
	else 
		return false;
}
bool cmp2(student a,student b)
{
	int t=strcmp(a.name,b.name);
	if(t==0){
		int m=strcmp(a.num,b.num);
		if(m==-1)
			return true;
		else 
			return false;
	}
	else {
		if(t==-1)
			return true;
		else 
			return false;	
	}

}
bool cmp3(student a,student b)
{
	if(a.grade==b.grade){
		int m=strcmp(a.num,b.num);
		if(m==-1)
			return true;
		else 
			return false;
	}
	else 
		return a.grade<b.grade;
}
int main()
{
	int n,c,kase=1;
	while(scanf("%d%d",&n,&c)&&n!=0){
		for(int i=0;i<n;i++){
			scanf("%s %s %d",p[i].num,p[i].name,&p[i].grade);
		}
		switch(c){
			case 1:{
				sort(p,p+n,cmp1);
				break;
			}
			case 2:{
				sort(p,p+n,cmp2);
				break;
			}
			case 3:{
				sort(p,p+n,cmp3);
				break;
			}
		}
		printf("Case %d:\n",kase++);
		for(int i=0;i<n;i++){
			printf("%s %s %d\n",p[i].num,p[i].name,p[i].grade);
		}
	}
return 0;
}
C题:前m大的数

要考虑时间复杂度问题,有可能时间超限

#include<cstdio>
#include<algorithm>
using namespace std;
int an[3000],bn[1000000];
bool cmp(int a,int b)
{
	return a>b;
}
int main()
{
	int n,m;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		for(int i=0;i<n;i++)
			scanf("%d",&an[i]);
		sort(an,an+n,cmp);
		int t=0;
		if(m<n) n=m;
		for(int i=0;i<n;i++){
			for(int j=i+1;j<n;j++){
				bn[t++]=an[i]+an[j];
			}
		}
		sort(bn,bn+n*(n-1)/2,cmp);
		for(int i=0;i<m;i++)
			printf("%d%c",bn[i],i==m-1?'\n':' ');
	}
return 0;
}
D题:统计同成绩学生人数

一道水水的题,不过当时心态有点乱。。

#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
	int n,m,a[1000];
	while(scanf("%d",&n)&&n!=0){
		int p=0,i;
		for(i=0;i<n;i++){
			scanf("%d",&a[i]);
		}
		scanf("%d",&m);
		for(i=0;i<n;i++){
			if(a[i]==m) {
				p++;
			}			
		}
		printf("%d\n",p);
	}
return 0;
}
E题:稳定排序

需要加一个标记整数,作为序列号,使得能够稳定排序

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct student
{
	char name[55];
	int num;
	int ni;
}p[300],q[300];
bool cmp(student a,student b)
{
	if(a.num==b.num) return a.ni<b.ni;
	else return a.num>b.num;
}
int main()
{
	int n,x,y,i;
	while(scanf("%d",&n)!=EOF){
		x=y=0;
		for(i=0;i<n;i++){
			scanf("%s %d",p[i].name,&p[i].num);
			p[i].ni=i+1;
		}
			
		for(i=0;i<n;i++){
			scanf("%s %d",q[i].name,&q[i].num);
			q[i].ni=i+1;
		}
			
		sort(p,p+n,cmp);
		for(i=0;i<n;i++){
			if(strcmp(p[i].name,q[i].name)){
				x=1;
			}
			if(p[i].num!=q[i].num){
				y=1;break;
			}
		}
		if(y==1) printf("Error\n");
		else if(x==1) printf("Not Stable\n");
		if(x==0&&y==0) printf("Right\n");
		if(x==1||y==1) for(i=0;i<n;i++){
			printf("%s %d\n",p[i].name,p[i].num);
		}
	}
return 0;
}
F题:What Is Your Grade?
这个写的有点麻烦了。。

#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
struct score
{
	int num;
	int ti;
	int time;
	int score;
}p[100];
bool cmp1(score a,score b)
{
	if(a.ti==b.ti) return a.time<b.time;
	else return a.ti>b.ti;
}
bool cmp2(score a,score b)
{
	return a.num<b.num;
}
int main()
{
	int n,a[6];
	while(scanf("%d",&n)&&n>0){
		int i,j,h,m,s;
		for(i=0;i<n;i++){
			scanf("%d%d:%d:%d",&p[i].ti,&h,&m,&s);
			p[i].time=h*3600+m*60+s;
			p[i].num=i+1;
		}
		sort(p,p+n,cmp1);
		memset(a,0,sizeof(a));
		for(i=0;i<n;i++){
			switch(p[i].ti){
				case 0:{
					a[0]++;p[i].score=50;
					break;
				}
				case 1:{
					a[1]++;
					break;
				}
				case 2:{
					a[2]++;
					break;
				}
				case 3:{
					a[3]++;
					break;
				}
				case 4:{
					a[4]++;
					break;
				}
				case 5:{
					a[5]++;p[i].score=100;
					break;
				}
			}
		}
		for(i=a[5];i<n;i++){
			if(i<a[5]+a[4]/2) p[i].score=95;
			else if(i<a[5]+a[4]) p[i].score=90;
			else if(i<a[5]+a[4]+a[3]/2) p[i].score=85;
			else if(i<a[5]+a[4]+a[3]) p[i].score=80;
			else if(i<a[5]+a[4]+a[3]+a[2]/2) p[i].score=75;
			else if(i<a[5]+a[4]+a[3]+a[2]) p[i].score=70;
			else if(i<a[5]+a[4]+a[3]+a[2]+a[1]/2) p[i].score=65;
			else if(i<a[5]+a[4]+a[3]+a[2]+a[1]) p[i].score=60;
		}
		sort(p,p+n,cmp2);
		for(i=0;i<n;i++){
			printf("%d\n",p[i].score);
		}
		printf("\n");	
	}
return 0;
}
G题: Bear and Three Balls

先排序,然后把重复的去掉就行。

#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
	int n,i,an[50],bn[50],p,m;
	while(scanf("%d",&n)!=EOF){
		for(i=0;i<n;i++)
			scanf("%d",&an[i]);
		sort(an,an+n);
		p=0;m=0;
		for(i=0;i<n;i++){
			if(an[i]==an[i-1]&&i!=0) continue;
			bn[p++]=an[i];
		}
		for(int j=0;j<p-2;j++){
			if(bn[j]==bn[j+1]-1&&bn[j]==bn[j+2]-2){
				m=1;break;
			}
		}
		if(m) printf("YES\n");
		else printf("NO\n");
	}
return 0;	
}
H题: 今年暑假不AC(贪心)
贪心算法,区间相关问题。

先将结束时间给排序,每次选区间1,排序后扫描一次即可。

#include<cstdio>
#include<algorithm>
using namespace std;
struct time 
{
	int begin;
	int end;
}p[100];
bool cmp(time a,time b)
{
	return a.end<b.end;
}
int main()
{
	int n,m,i;
	while(scanf("%d",&n)&&n!=0){
		for(i=0;i<n;i++)
			scanf("%d%d",&p[i].begin,&p[i].end);
		sort(p,p+n,cmp);
		m=1;
		int q=0;
		for(i=1;i<n;i++){
			if(p[i].begin<p[q].end) continue;
			else {
				q=i;m++;
			}
		}
		printf("%d\n",m);
	}
return 0;
}









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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值