题目描述
又要考试了,Ljw 决定放松一下,就打开电视,看见了篮球赛,他立即想到了每年的 NBA 总冠军队伍。由于复习紧张,他只记起了一部分,记忆的内容是正确的,可能不是按时间顺序排列的,记忆的内容可能有重复。现在请求学过编程的你帮助 Ljw,按时间依次输出总冠军的球队(不能重复)。(NBA 从 1947A.D 到 2017A.D)
输入描述
第一行是一个整数 n( 0 <n<80 )。接下来的 n行,每行先是城市名(由大小写字母、空格组成),后是时间(由数字组成)二者之间用空格隔开
输出描述
共 n 行,即排序后的 NBA 总冠军队伍。每行先是时间,后是城市名。
样例输入
4
Boston 1963
Boston 1959
Philly 1947
New York 1970
6
Los Angeles 2000
Miami 2006
Boston 1964
Los Angeles 2000
Boston 1965
Los Angeles 2002
样例输出
1947 Philly
1959 Boston
1963 Boston
1970 New York
1964 Boston
1965 Boston
2000 Los Angeles
2002 Los Angeles
2006 Miami
AC代码
#include<iostream>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;
typedef struct nba //定义结构体来存储信息
{
string str;
int year;
}NBA;
bool cmp(NBA& x, NBA& y)
{
return x.year < y.year;
}
int main()
{
int n;
while (scanf("%d", &n) != EOF)
{
getchar(); //吸收输入n以后的那个回车
NBA arr[1000];
int i;
for (i = 0; i < n; i++)
{
getline(cin, arr[i].str); //先将整体当作一个字符串输入
int j;
int temp = 0;
int index = 0;
//将后四位的数字拿出来,转换成年份
for (j = arr[i].str.length() - 1; j >= arr[i].str.length() - 4; j--)
{
temp += (arr[i].str[j] - '0') * pow(10, index);
index++;
}
arr[i].year = temp;
//删除后四位数字
arr[i].str.erase(arr[i].str.size() - 4, 4);
}
int j;
i = 1;
int length = n;
while (i < length)
{
int flag = 1; //标志变量,判断是否有重复内容
int index = i;
//找是否有重复输入
for (j = 0; j < i; j++)
{
if (arr[j].year == arr[i].year)
{
//将重复的内容覆盖掉,然后长度减1
for (index; index < length - 1; index++)
{
arr[index].str = arr[index + 1].str;
arr[index].year = arr[index + 1].year;
flag = 0;
}
length--;
break;
}
}
if (flag) i++;
}
sort(arr, arr + length, cmp); //排序
for (i = 0; i < length; i++)
{
cout << arr[i].year << " " << arr[i].str << endl;
}
}
return 0;
}