一、排序专项
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;
}
二、总结
今天是放飞自我的一天,就刷了几道题,还是暴露出了很多问题,读题不认真。今天刷的题大都和桶排的思想有关,将问题巧妙地转化到数组内完成。