• 信奥赛一本通:数据排序(合影效果、病人排队、明明的随机数、单词排序、出现次数超过一半的数、统计字符数)


    1182:合影效果

    在这里插入图片描述
    由题目可知,n个人有 性别与身高两种属性,则我们用结构体去做。

    1. 定义结构体,并输入值。
    struct Student{
    	string sex;
    	double high;
    };
    int main(){
    	Student stu[105];
    	int n;
    	cin>>n;
    	for(int i=0;i<n;i++){
    		cin>>stu[i].sex>>stu[i].high;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    1. sort排序,依据男在左,女在右。当性别一致,则按身高排序,男生身高从小到大,女生则从高到低。
    bool cmp(Student x,Student y){
    	if(x.sex!=y.sex){
    		return x.sex>y.sex;
    	}
    	else{
    		if(x.sex=="male"){
    			return x.high<y.high;
    		}
    		return x.high>y.high;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    1. 最后输出
      总代码:
    //1182:合影效果
    #include
    using namespace std;
    struct Student{
    	string sex;
    	double high;
    };
    bool cmp(Student x,Student y){
    	if(x.sex!=y.sex){
    		return x.sex>y.sex;
    	}
    	else{
    		if(x.sex=="male"){
    			return x.high<y.high;
    		}
    		return x.high>y.high;
    	}
    }
    int main(){
    	Student stu[105];
    	int n;
    	cin>>n;
    	for(int i=0;i<n;i++){
    		cin>>stu[i].sex>>stu[i].high;
    	}
    	sort(stu,stu+n,cmp);
    	for(int i=0;i<n;i++){
    		printf("%.2f ",stu[i].high);
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    1183:病人排队

    在这里插入图片描述
    根据题目:我们可分为老年人看病 与 非老年人看病 的排队顺序。病人有病号与年龄两个属性。老规矩用结构体。

    1. 一个病人要有ID、年龄、排号顺序。定义结构体并输入;
    struct Per{
    	string id;
    	int age,num;
    };
    
    int main(){
    	Per p[105];
    	Per a[105], b[105]; //a是老年人 b是非老年人
    	int n,len1=1,len2=1;	
    	cin>>n;
    	for(int i=1;i<=n;i++){
    		cin>>p[i].id>>p[i].age;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    1. 通过判断年龄>=60,进行分类,老年人a数组, 非老年人b数组。
    	for(int i=1;i<=n;i++){
    		if(p[i].age>=60){
    			a[len1].num = len1;
    			a[len1].age = p[i].age;
    			a[len1++].id = p[i].id;
    		}
    		else{
    			b[len2++].id = p[i].id;
    		}
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    3.对a数组老年人进行sort排序,年龄从大到小,当年龄相同按排号登记顺序先后。

    bool cmp(Per x,Per y){
    	if(x.age!=y.age) return x.age>y.age;
    	else if(x.age==y.age) return x.num<y.num;
    }
    
    sort(a+1,a+1+len1,cmp);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4.排完序后,进行输出,先输出老年人再输出非老年人。

    for(int i=1;i<len1;i++) cout<<a[i].id<<endl;
    for(int j=1;j<=len2;j++) cout<<b[j].id<<endl;
    
    • 1
    • 2

    总代码:

    //1183:病人排队
    #include
    using namespace std;
    struct Per{
    	string id;
    	int age,num;
    };
    bool cmp(Per x,Per y){
    	if(x.age!=y.age) return x.age>y.age;
    	else if(x.age==y.age) return x.num<y.num;
    }
    int main(){
    	Per p[105];
    	Per a[105], b[105];
    	int n,len1=1,len2=1;	
    	cin>>n;
    	for(int i=1;i<=n;i++){
    		cin>>p[i].id>>p[i].age;
    	}
    	for(int i=1;i<=n;i++){
    		if(p[i].age>=60){
    			a[len1].num = len1;
    			a[len1].age = p[i].age;
    			a[len1++].id = p[i].id;
    		}
    		else{
    			b[len2++].id = p[i].id;
    		}
    	}
    	sort(a+1,a+1+len1,cmp);
    	for(int i=1;i<len1;i++) cout<<a[i].id<<endl;
    	for(int j=1;j<=len2;j++) cout<<b[j].id<<endl;
    	return 0;
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    1184:明明的随机数

    在这里插入图片描述在这里插入图片描述
    由题目可知,去重与排序,我们可用 “桶排序” 做,很方便。

    1. 统计桶的数量,这样每个桶的值只输出一次,那就不会有重复的!
    #include
    using namespace std;
    int a[10000],b[10000]; //默认数组值0 
    int main(){
    	//4.桶排序
    	int n,x,cnt=0;
    	cin>>n;
    	for(int i=1;i<=n;i++){
    		cin>>x; // 4 4 5 9 
    		a[x]=a[x]+1; //统计桶的数量 
    	} 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    1. 判断有桶号,只执行一次,就可以去重
    	for(int i=0;i<1000;i++) {
    		if(a[i]>0){ //有数量 
    			b[cnt++]=i; //b去重 排好序 
    		}
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 最后输出个数与值。
      总代码:
    #include
    using namespace std;
    int a[10000],b[10000]; //默认数组值0 
    int main(){
    	//4.桶排序
    	int n,x,cnt=0;
    	cin>>n;
    	for(int i=1;i<=n;i++){
    		cin>>x; // 4 4 5 9 
    		a[x]=a[x]+1; //统计桶的数量 
    	} 
    	for(int i=0;i<1000;i++) {
    		if(a[i]>0){ //有数量 
    			b[cnt++]=i; //b去重 排好序 
    		}
    	}
    	cout<<cnt<<endl;
    	for(int i=0;i<cnt;i++){
    		cout<<b[i]<<" ";
    	} 
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    1185:单词排序

    在这里插入图片描述在这里插入图片描述
    由题目可知,需要输入多个字符串,我们可以定义字符串的数组s进行输入。
    用到一维数组的输入,排序我们直接用sort即可。
    但是我们重复的只能输出一次,那排序后,重复的单词会在相邻位置,只要判断数组前一个与后一个的值不等就存到另外一个数组ss。
    遍历完所有字符串就,输出数组ss。

    //1185:单词排序
    #include
    using namespace std;
    int main(){
    	int i=0,k=0;
    	string s[105],ss[105];
    	while(cin>>s[i]){
    		i++;
    	}
    	sort(s,s+i);
    	for(int j=1;j<i;j++){
    		if(s[j-1]!=s[j]) ss[k++]=s[j-1];
    	}
    	if(s[i-2]!=s[i-1]) ss[k++] = s[i-1];
    	for(int i=0;i<k;i++){
    		cout<<ss[i]<<endl;
    	}
    	return 0;
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    //1185:单词排序
    #include
    using namespace std;
    int main(){
    	int i=0,k=0;
    	string s[105];
    	while(cin>>s[i]){
    		i++;
    	}
    	sort(s,s+i);
    	for(int j=1;j<=i;j++){
    		if(s[j-1]!=s[j]){
    			cout<<s[j-1]<<endl;
    		}
    	}
    	return 0;
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    1186:出现次数超过一半的数

    在这里插入图片描述在这里插入图片描述
    通过题目可知,我们要找次数超过一半的数,那我们要统计每个数的次数,可用桶排序;但要注意,数组的值是有-50的,所以我们可以让每个数组编号+50再统计。

    int x,b[1005]={0};
    int main(){
    	int n,flag=0;
    	cin>>n; 
    	for(int i=0;i<n;i++){
    		cin>>x;
    		b[x+50]++; //注意数值有负 
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    统计完只要在0到1000值内判断,数组值>n/2,就可以输出 编号值-50。
    注意细节,要是没有满足if条件则没有找到,要输出no。

    //1186:出现次数超过一半的数
    #include
    using namespace std;
    int x,b[1005]={0};
    int main(){
    	int n,flag=0;
    	cin>>n; 
    	for(int i=0;i<n;i++){
    		cin>>x;
    		b[x+50]++; //注意数值有负 
    	}
    	for(int i=0;i<1000;i++){
    		if(b[i]>n/2){
    			cout<<i-50<<endl;
    			flag=1; 
    			break;
    		}
    	}
    	if(flag==0){
    		cout<<"no"<<endl;
    	}
    	return 0;
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    1187:统计字符数

    在这里插入图片描述
    统计个数,现在我们可以用桶排序方便。统计完每个字母的次数,我们在从a到z判断哪个字母的次数最多,找出来最大值。

    //1187:统计字符数
    #include
    using namespace std;
    int b[1000];
    int main(){
    	string s;
    	char c;
    	int max=0;
    	
    	cin>>s;
    	for(int i=0;i<s.size();i++){
    		b[s[i]]++;	
    	} 
    	for(int i='a';i<='z';i++){
    		if(max<b[i]){
    			max = b[i]; //记录数量最大值 
    			c=i; 
    		}
    	}
    	cout<<c<<" "<<max<<endl;
    	return 0;
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
  • 相关阅读:
    Object.assign用法 以及 与$.extend的区别
    Appium框架
    人工智能笔记
    Docker | docker常用命令
    Redis篇之redis服务的启动方式总结
    Sentinel的流控与熔断降级规则详解
    【附源码】计算机毕业设计SSM软考刷题系统
    leetcode 6151. 统计特殊整数
    Spring Boot 异步线程静态获取request对象为空 RequestContextHolder 为空 Java 异步线程获取request为空
    白盒测试案例设计(我爷爷都能看懂)
  • 原文地址:https://blog.csdn.net/weixin_44775255/article/details/134029237