[C++]H106OJ-第一周练习总结-前十名-班级排名-身份证排序

题目一:前十名

Description

数据很多,但我们经常只取前几名,比如奥运只取前3名。现在我们有n个数据,请按从大到小的顺序,输出前10个名数据。

Input

两行。

第一行一个整数n,表示要对多少个数据

第二行有n个整数,中间用空格分隔。表示n个数据。

Output

一行,按从大到小排列的前10个数据,每个数据之间用一个空格隔开

Sample Input 1

26
54 27 87 16 63 40 40 22 61 6 57 70 0 42 11 50 13 5 56 7 8 86 56 91 68 59

Sample Output 1

91 87 86 70 68 63 61 59 57 56

思路:

本题要求明确,描述清晰。很简单,只需要排序后输出前十个即可。我采取优化过的冒泡排序。代码如下: 

#include <iostream>
using namespace std;

int main()
{
	int A[200];
	int n = 0;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		int j = 0;
		cin >> j;
		A[i] = j;
	}
	/*for (int i = 0; i < n; i++)
	{
		cout << A[i] << " ";
	}*/

	int i, exchange, bound, temp;
	exchange = n - 1;
	while (exchange != 0)
	{
		bound = exchange;
		exchange = 0;
		for (i = 0; i < bound; i++)
		{
			if (A[i] > A[i + 1]) {
				temp = A[i];
				A[i] = A[i + 1];
				A[i + 1] = temp;
				exchange = i;
			}
		}
	}
	int x = n-1;
	for (int i = 0; i <10 ; i++)
	{
		cout << A[x] << " ";
		x--;
	}
	return 0;
}

本周第一题结束!


题目二:班级排名

Description

达达在陶陶的影响下,也对学习慢慢的产生了兴趣。

他在每次考试之后,都会追着老师问,自己在班级的总名次是多少。考试一多,老师也不耐烦了,于是他给了达达所有人的成绩,让他自己去算出自己的排名。

可人太多了,达达也无法立即算出来,于是他想让你帮帮他。

Input

第一行为一个整数N,代表班级的学生总数。

接下来N行,每行一个字符串,代表一个学生的姓名,第一行总是DaDa。

接下来一行一个整数M,代表一共有M次考试。

每次考试有N行,每行有以一个空格分隔的一个正整数S和一个字符串P,代表名字为P的学生在这次考试中得了S分。

Output

一共M行,每行一个整数,代表达达在班级里的排名,排名是这一次考试过后的所有考试总分排名,如果达达和别人并列,达达总是排在前面。

 Sample Input 1

3
DaDa 



49 DaDa 
49 A 
48 B 
80 A 
85 B 
83 DaDa

Sample Output 1

1 2

 思路:

从题目可得,需要将姓名与输入的分数进行匹配,并且将每一次考试的成绩算出并排名,而且排名为前几次成绩排名的总和,因此建立的结构体,算法中,运用sort()函数,并且自定义了小于关系,代码如下:

#include<iostream>
#include <algorithm>
using namespace std;

struct people
{
	string name;
	int score;
};

bool rule(people x,people y);

int main()
{
	people a[101];
	int n;
	cin>>n;
	for(int i; i<n; i++)
	{
		cin>>a[i].name;
		a[i].score=0;
	}
	int m;
	cin>>m;
	int rank[m];
	int b=0;
	for(int i=0; i<m; i++)
	{
		for(int i=0; i<n; i++)
		{
			int tempscore;
			string tempname;
			cin>>tempscore>>tempname;
			for(int j=0; j<n; j++)
			{
				if(tempname==a[j].name)
				{
					a[j].score+=tempscore;
				}
			}
		}
		sort(a,a+n,rule);
		for(int j=0; j<n; j++)
		{
			if(a[j].name=="DaDa")
			{
				rank[b]=j+1;
			}
		}
		cout<<rank[b]<<endl;
		b++;
	}
}

bool rule(people x,people y)
{
	if(x.score==y.score)
	{
		if(y.name=="DaDa")
		{
			return 0;
		}
		return 1;
	}
	else
	{
		return x.score>y.score;
	}
}

本周题目二结束


题目三:身份证排序

Description

安全局搜索到了一批(n个)身份证号码,希望按出生日期对它们进行从大到小排序,如果有相同日期,则按身份证号码大小进行排序。身份证号码为18位的数字组成,出生日期为第7到第14位

Input

第一行一个整数n,表示有n个身份证号码

余下的n行,每行一个身份证号码。

Output

按出生日期从大到小排序后的身份证号,每行一条

 Sample Input 1

5
466272307503271156
215856472207097978
234804580401078365
404475727700034980
710351408803093165

Sample Output 1

404475727700034980
234804580401078365
215856472207097978
710351408803093165
466272307503271156

思路: 

从题目看出身份证长度已经超出INT和LONG的范围,从而想出运用string类型进行身份证号的保存,并且通过有关于string的函数,将出生年月日截取出来,再通过sort()算法进行排序,sort()中自定义小于关系并且定义数值相等的处理情况

#include<iostream>
#include <algorithm>
using namespace std;

bool cmp(string id1, string id2);

int main()
{
	string ID[100000];
	int n;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> ID[i];
	}
	sort(ID, ID + n, cmp);

	for (int i = 0; i < n; i++)
	{
		cout << ID[i] << "\n";
	}
}

bool cmp(string id1, string id2)
{
	if (id1.substr(6, 8) == id2.substr(6, 8))
	{
		return id1 > id2;
	}
	else {
		return id1.substr(6, 8) > id2.substr(6, 8);
	}
}

 


在本周总共有五道题,尝试了,但是没有写的是冒泡排序技术和士兵排序问题,希望通过下周学习将这两道题AC了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值