HDU 5427 A problem of sorting 水题

问题描述
给出一张许多人的年龄和生日表。你需要从年轻到年老输出人们的名字。(没有人年龄相同)
输入描述
第一行包含一个正整数T(T \leq 5)T(T≤5),表示数据组数。
对于每组数据,第一行包含一个正整数n(1 \leq n \leq 100)n(1≤n≤100),表示人数,接下来n行,每行包含一个姓名和生日年份(1900-2015),用一个空格隔开。姓名长度大于0且不大于100。注意姓名中只包含字母,数字和空格。
输出描述
对于每组数据,输出nn行姓名。
输入样例
2
1
FancyCoder 1996
2
FancyCoder 1996
xyz111 1997
输出样例
FancyCoder
xyz111
FancyCoder

解题思路:
开一个结构体,里面有名字和出生日期,读入一整个串,然后将后四位转化为出生日期给结构体中的日期,将名字给结构体中的名字,然后重定义运算符sort排序一下就好了。
这道题被坑在了string上,string的结尾并不是’\0’,我以为赋值成了’\0’就不会就输出,结果事实是我输出的是名字和5个空格,最蛋疼的是多输出空格给的不是PE而是WA。。。。。

第二天看了看,有两种方法解题:
第一种是使用迭代器:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<queue>
#include<algorithm>
#include<stack>
#include<cstring>
#include<vector>
#include<list>
#include<set>
#include<string>
#include<map>
using namespace std;
struct p
{
    string name;
    int year;
};
bool cmp(p a1,p a2)
{
    return a1.year>a2.year;
}
int main()
{
    //freopen("in.txt","r",stdin);
    int t;
    scanf("%d",&t);
    getchar();
    while(t--)
    {
        p a[105];
        int n;
        scanf("%d",&n);
        getchar();
        for(int i=0; i<n; i++)
        {
            getline(cin,a[i].name);
            string &b=a[i].name;
            a[i].year=0;
            for(string ::iterator j=b.end()-4;j!=b.end();)
            {
                a[i].year=a[i].year*10+*j-'0';
                b.erase(j);
            }
            b.erase(b.end()-1);
        }
        sort(a,a+n,cmp);
        for(int i=0; i<n; i++)
            cout<<a[i].name<<endl;
    }
    return  0;
}

第二种是用截取字符串的函数
string substr(int pos = 0,int n = npos) const;
//返回pos开始的n个字符组成的字符串

#include<iostream>
#include<cstdio>
#include<cmath>
#include<queue>
#include<algorithm>
#include<stack>
#include<cstring>
#include<vector>
#include<list>
#include<set>
#include<string>
#include<map>
using namespace std;
struct p
{
    string name;
    int year;
    p()
    {
        year=0;
    }
};
bool cmp(p a1,p a2)
{
    return a1.year>a2.year;
}
int main()
{
    int t;
    scanf("%d",&t);
    getchar();
    while(t--)
    {
        p a[105];
        int n;
        scanf("%d",&n);
        getchar();
        for(int i=1; i<=n; i++)
        {
            getline(cin,a[i].name);
            string &b=a[i].name;
            for(int j=b.size()-4;j<b.size(); j++)
                a[i].year=a[i].year*10+b[j]-'0';
            b=b.substr(0,b.size()-5);
        }
        sort(a+1,a+n+1,cmp);
        for(int i=1; i<=n; i++)
            cout<<a[i].name<<endl;
    }

    return  0;
}

友情提示:记得getchar();

你可能感兴趣的:(水,hdu5427)