3.23算法学习——备战21蓝桥杯

一、排序专项

1.病人排队

时间限制: 1000 ms 内存限制: 65536 KB
提交数: 16013 通过数: 6765
【题目描述】
病人登记看病,编写一个程序,将登记的病人按照以下原则排出看病的先后顺序:

1.老年人(年龄 >= 60岁)比非老年人优先看病。

2.老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序。

3.非老年人按登记的先后顺序看病。

【输入】
第1行,输入一个小于100的正整数,表示病人的个数;

后面按照病人登记的先后顺序,每行输入一个病人的信息,包括:一个长度小于10的字符串表示病人的ID(每个病人的ID各不相同且只含数字和字母),一个整数表示病人的年龄,中间用单个空格隔开。

【输出】
按排好的看病顺序输出病人的ID,每行一个。

【输入样例】
5
021075 40
004003 15
010158 67
021033 75
102012 30
【输出样例】
021033
010158
021075
004003
102012

思路
主要还是结构体,但是需要注意的是这个需要稳定的排序方式。所以不能使用快排

代码

#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<cmath>
#include<iomanip>
using namespace std;
typedef long long ll;
struct node{
	string id;
	int s;
};
bool cmp(double a,double b){    
	return a>b;
} 
int main()
{
	int n,k=0,m=0;
	int len=0;
	node a[100],b[100];
	string temp;
	int h;
	cin>>n;
	for(int i=0;i<n;i++) 
	{
		cin>>temp>>h;
		if(h>=60)
		{
			a[k].id=temp;
			a[k].s=h;
			k++;
		}
		else 
		{
			b[m].id=temp;
			b[m].s=h;
			m++;
		}
	}
	
	for(int i=0;i<k-1;i++)
	{
		for(int j=0;j<k-1-i;j++)
		{
			if(a[j].s<a[j+1].s)
			{
				node tem=a[j];
				a[j]=a[j+1];
				a[j+1]=tem;
			} 
		}
	}

	for(int i=0;i<k;i++)
		cout<<a[i].id<<endl;
	for(int i=0;i<m;i++)
		cout<<b[i].id<<endl;
	return 0;
}

2.明明的随机数

时间限制: 1000 ms 内存限制: 65536 KB
提交数: 16168 通过数: 10083
【题目描述】
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。

【输入】
有2行,第1行为1个正整数,表示所生成的随机数的个数:N;

第2行有N个用空格隔开的正整数,为所产生的随机数。

【输出】
也是2行,第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。

【输入样例】
10
20 40 32 67 40 20 89 300 400 15
【输出样例】
8
15 20 32 40 67 89 300 400

思路
运用了桶排序的思想
代码

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
	int n;
	int a[1001]={0};
	int k,t=0;
	cin>>n; 
	for(int i=0;i<n;i++)
	{
		cin>>k;
		if(a[k]==0)t++;
		a[k]=1;
	}
	cout<<t<<endl;
	for(int i=1;i<=1000;i++)
	{
		if(a[i])
		 cout<<i<<" ";
	}
	return 0;
}

3.单词排序

时间限制: 1000 ms 内存限制: 65536 KB
提交数: 11035 通过数: 5610
【题目描述】
输入一行单词序列,相邻单词之间由1个或多个空格间隔,请按照字典序输出这些单词,要求重复的单词只输出一次。(区分大小写)

【输入】
一行单词序列,最少1个单词,最多100个单词,每个单词长度不超过50,单词之间用至少1个空格间隔。数据不含除字母、空格外的其他字符。

【输出】
按字典序输出这些单词,重复的单词只输出一次。

【输入样例】
She wants to go to Peking University to study Chinese
【输出样例】
Chinese
Peking
She
University
go
study
to
wants

思路
创建字符串数组,去重时运用了string的函数 compare(),来判断是否相等,然后将数组用sort排序

代码

#include<iostream>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
using namespace std;
int main()
{
	string str[101];
	string t;
	int len=0;
	while(cin>>t)
	{
		int flag=1;
		for(int i=0;i<len;i++)
		{
			if(t.compare(str[i])==0)
			{
				flag=0;
				break; 
			} 
		}
		if(flag)str[len++]=t;
	}
	sort(str,str+len);
	for(int i=0;i<len;i++)
		cout<<str[i]<<endl;
	return 0;
}

4.出现次数超过一半的数

时间限制: 1000 ms 内存限制: 65536 KB
提交数: 14333 通过数: 6620
【题目描述】
给出一个含有n(0 < n <= 1000)个整数的数组,请找出其中出现次数超过一半的数。数组中的数大于-50且小于50。

【输入】
第一行包含一个整数n,表示数组大小;

第二行包含n个整数,分别是数组中的每个元素,相邻两个元素之间用单个空格隔开。

【输出】
如果存在这样的数,输出这个数;否则输出no。

【输入样例】
3
1 2 2
【输出样例】
2

思路
还是桶排序的思想,找出数组中最大的那个数,下标即出现次数最多的数

代码

#include<iostream>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
using namespace std;
int main()
{
	int n;
	int a[101]={0};
	cin>>n;
	int k;
	for(int i=0;i<n;i++)
	{
		cin>>k;
		a[k+50]++;
	}
	int flag=0;
	for(int i=0;i<101;i++)
	{
		if(a[i]>n/2.0)
		{
			flag=1;
			k=i;
			break;
		}
	}
	if(flag)cout<<k-50<<endl;
	else cout<<"no"<<endl;
	return 0;
}

5.统计字符数

时间限制: 1000 ms 内存限制: 65536 KB
提交数: 10574 通过数: 6060
【题目描述】
给定一个由a-z这26个字符组成的字符串,统计其中哪个字符出现的次数最多。

【输入】
输入包含一行,一个字符串,长度不超过1000。

【输出】
输出一行,包括出现次数最多的字符和该字符出现的次数,中间以一个空格分开。如果有多个字符出现的次数相同且最多,那么输出ascii码最小的那一个字符。

【输入样例】
abbccc
【输出样例】
c 3

思路
也是桶排序的思想,将字符巧妙地和数组下标联系在一起。

代码

#include<iostream>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
using namespace std;
int main()
{
	int a[30]={0};
	char ch;
	int len=0;
	int k;
	while(cin>>ch)
	{
		a[ch-97]++;
	}
	int maxx=-1;
	for(int i=0;i<26;i++)
		if(a[i]>maxx)
		{
			maxx=a[i];
			k=i;
		}
	cout<<char(k+'a')<<" "<<maxx<<endl;
	return 0;
}

二、总结

今天是放飞自我的一天,就刷了几道题,还是暴露出了很多问题,读题不认真。今天刷的题大都和桶排的思想有关,将问题巧妙地转化到数组内完成。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值