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; } }