题目一:前十名
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
A
B
2
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了。