NOJ coder的音乐烦恼--字符串处理

 

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

你可能感兴趣的:(C++,字符串处理,字符串转换)