第四周做题总结

这篇博客分享了作者在编程练习中使用快速排序算法(qsort)解决实际问题的经验,包括对数字、生日和字符串的排序。作者强调了qsort在提高效率和简化代码方面的优势,并反思了在处理日期排序时易犯的错误。此外,还介绍了如何对包含结构体的数组进行排序,并提及了在处理字符串时使用库中的函数。
摘要由CSDN通过智能技术生成

一.

P1177 【模板】快速排序

题目描述

利用快速排序算法将读入的 N个数从小到大排序后输出。

快速排序是信息学竞赛的必备算法之一。对于快速排序不是很了解的同学可以自行上网查询相关资料,掌握后独立完成。(C++ 选手请不要试图使用 STL,虽然你可以使用 sort 一遍过,但是你并没有掌握快速排序算法的精髓。)

输入格式

第 1行为一个正整数 N,第 22 行包含 N 个空格隔开的正整数 a,为你需要进行排序的数,数据保证了 A不超过 10^9。

输出格式

将给定的 N个数从小到大输出,数之间空格隔开,行末换行且无空格。

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int n;
	scanf("%d",&n);
	int a[n];
	int i;
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	int cmp(const void *a,const void *b)
	{
		return *(int *)a- *(int *)b;
	}
	
	qsort(a,n,sizeof(a[0]),cmp);
	for(i=0;i<n;i++)
	{
		printf("%d ",a[i]);
	}
	return 0;
	
	
}

虽然知道快排可以优化,但是这个周主要学习了一下qsort,而且马上到来的比赛和后面做题也应该会比较多的用到qsort,所以这周打的题基本都是用qsort的方法,而且相比于一直过不了的快排,qsort真的很好用,学习了不同类型的用法.

二.

P1104 生日

题目描述

cjf君想调查学校OI组每个同学的生日,并按照从大到小的顺序排序。但cjf君最近作业很多,没有时间,所以请你帮她排序。

输入格式

有2行,

第1行为OI组总人数n;

第2行至第n+1行分别是每人的姓名s、出生年y、月m、日d。

输出格式

有n行,

即n个生日从大到小同学的姓名。(如果有两个同学生日相同,输入靠后的同学先输出)

#include <stdio.h>
#include <stdlib.h>
typedef struct student
{
	char name[22];
    int y;
	int m;
	int d;
	int h;
}Student;
int main()
{
	int n;
	scanf("%d",&n);
	Student p[n];
	int i;
	for(i=0;i<n;i++)
	{
		scanf("%s %d %d %d",p[i].name,&p[i].y,&p[i].m,&p[i].d);
		p[i].h=i+1;
	}
	int cmp(const void *a,const void *b)
	{
		Student *c=(Student *)a;
		Student *d=(Student *)b;
	    if(d->y!=c->y)
	    return -d->y+c->y;
	    else if(d->m!=c->m)
	    return -d->m+c->m;
	    else if(d->d!=c->d)
	    return -d->d+c->d;
	    else
	    return d->h-c->h;
		}	
		qsort(p,n,sizeof(p[0]),cmp);
		for(i=0;i<n;i++)
		{
			printf("%s\n",p[i].name);
		}
		return 0;
		
}

这个题开始提交的时候一直WA,重看也没看出来错在哪里,后来修改后还是部分错,还以为问题出在了生日相同的情况,后来突然想起之前也犯过类似错误,就是生日的大小是年份,月份,日越小年龄越大,这种低级错误希望能减少.

三.

P1781 宇宙总统

题目描述

地球历公元 6036 年,全宇宙准备竞选一个最贤能的人当总统,共有 n个非凡拔尖的人竞选总统,现在票数已经统计完毕,请你算出谁能够当上总统。

输入格式

第一行为一个整数 n,代表竞选总统的人数。

接下来有 n 行,分别为第一个候选人到第 n个候选人的票数。

输出格式

共两行,第一行是一个整数 m,为当上总统的人的号数。

第二行是当上总统的人的选票。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct zt
{
	int hao;
    char ps[105];
}ZT;

int main()
{
	int n;
	scanf("%d",&n);
	struct zt p[n];
	int i;
	for(i=0;i<n;i++)
	{
		scanf("%s",p[i].ps);
		p[i].hao=i+1;
	}
    int cmp(const void *a,const void *b)
	{
		ZT *c=(ZT *)a;
		ZT *d=(ZT *)b;
	    if(strlen(d->ps)!=strlen(c->ps))
	    return strlen(d->ps)-strlen(c->ps);
	    else
	    return strcmp(d->ps,c->ps);
		}	
		qsort(p,n,sizeof(p[0]),cmp);
		printf("%d\n",p[0].hao);
		printf("%s",p[0].ps);
	return 0;
		
}

这道题是用了qsort对结构体的排序,同时用到了<string.h>中的几个函数,综合性比较强,不得不说qsort对于过题的帮助还是很大的,效率提高了不少.

随着做题目数量的增加,题目难度的提高,做题的速度越来越慢了,但是以后还是要坚持打题,总是会有进步的.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值