http://acm.nit.net.cn/showproblem.jsp?pid=1366
问题描述:
输入1个数N(1 <= N <= 5000),表示歌曲数.接下来共有N行,每行包括一个字符串m
(长度小于50字节,可能有中文,一个中文字占2个字节),以及一个数字p(p <= INT_MAX)。
m表示歌曲名,p表这首歌的优先级(1,2,3...),数字越小优先级就越高.优先级<=0的歌
曲是coder不喜欢的.保证不存在两首歌优先级相同的情况.保证不存在两首歌名称相同的情
况.
输出一个k,表示coder同学喜欢听的歌曲的数量.接下去k行,优先级从高到低,每行输出
coder同学喜欢听的音乐名称.
SAMPLE INPUT
2
月亮至上 -1
because of you 1
6
太早 3
不完整的旋律 4
第一个清晨 1
18 and life 2
still'loving 6
我恨你 5
SAMPLE OUTPUT
1
because of you
6
第一个清晨
18 and life
太早
不完整的旋律
我恨你
still'loving
#include<iostream>
#include<algorithm>
#include<string>
#include<cmath>
using namespace std;
int const ic_max = 5001;
struct stuNode
{
int iPriority;//优先级
string strSong;//歌曲名
};
void vInputData(int iN,stuNode stuSong[]);
void vGetData(string strT,stuNode& stuSong);
bool bCmp(const stuNode& stuA,const stuNode& stuB);
void vPrintAns(int iN,stuNode stuSong[]);
int main()
{
int iNum;
stuNode stuSong[ic_max];
while(cin >> iNum)
{
vInputData(iNum,stuSong);
sort(stuSong+1,stuSong+1+iNum,bCmp);
vPrintAns(iNum,stuSong);
}
return 0;
}
void vInputData(int iN,stuNode stuSong[])
{
string strTemp;
getchar();
for(int i=1; i<=iN; i++)
{
getline(cin,strTemp);//默认/n
vGetData(strTemp,stuSong[i]);
}
}
void vGetData(string strT,stuNode& stuSong)
{
int iPrio;
int iBlank;//标记最后一个空格的位置
string strPrio;//获取优先级的字符串形式
iPrio = 0;
//获取最后一个空格的位置
for(int i=strT.size()-1; i>=0; i--)
{
if(strT[i] == ' ')
{
iBlank = i;
break;
}
}
//截取相应子段
stuSong.strSong = strT.substr(0,iBlank);
strPrio = strT.substr(iBlank+1,strT.size()-iBlank);
//将字符串转换为数字
for(int i=strPrio.size()-1; i>=0; i--)
{
if(strPrio[i] == '-')
{
iPrio *= -1;
}
iPrio += (strPrio[i]-'0') * (int)pow(10.0,1.0*(strPrio.size()-1-i));
}
stuSong.iPriority = iPrio;
}
bool bCmp(const stuNode& stuA,const stuNode& stuB)
{
return stuA.iPriority < stuB.iPriority;
}
void vPrintAns(int iN,stuNode stuSong[])
{
int iTotal;
iTotal = iN;
//获取优先级<=0的个数
for(int i=1; i<=iN; i++)
{
if(stuSong[i].iPriority <= 0)
iTotal --;
else
break;
}
cout << iTotal << endl;
for(int i=iN-iTotal+1; i<=iN; i++)
{
cout << stuSong[i].strSong << endl;
}
}