链接:https://ac.nowcoder.com/acm/contest/26478/J 来源:牛客网

法一: 将题目所给数据放在函数里,每次k变换时调用函数得到一个字符串,并与k未变化前得到的字符串相比,相同不做处理,不同则按要求输出,并且每场结束后输出最后一次k变化得到的字符串(自成一行)

using namespace std;
string pan(int k) {
	string s;
	if (k >= 3000)
		s = "Legendary grandmaster";
	else if (k >= 2600)
		s = "International grandmaster";
	else if (k >= 2400)
		s = "Grandmaster";
	else if (k >= 2300)
		s = "International master";
	else if (k >= 2100)
		s = "Master";
	else if (k >= 1900)
		s = "Candidate master";
	else if (k >= 1600)
		s = "Expert";
	else if (k >= 1400)
		s = "Specialist";
	else if (k >= 1200)
		s = "Pupil";
	else
		s = "Newbie";
	return s;
}
int main() {
	int n, m, k, a;
	string s1, s2;
	cin >> n;
	while (n--) {
		cin >> m >> k;
		while (m--) {
			cin >> a;
			s1 = pan(k);
			k += a;
			s2 = pan(k);
			if (s1 != s2)
				cout << s1 << " -> " << s2 << endl;
		}
		cout << s2 << endl;
	}
	return 0;
}

总结:数据量大,并且需要多次判断时,用调用函数的方法解决

法二: 借用map容器,将每个整型数值k映射到相对应的字符串,这样就实现了k与字符串之间的联系

using namespace std;
int main(){
    map<int,string>mp;
    for(int i=-12000;i<1200;i++)mp[i]="Newbie";
    for(int i=1200;i<=1399;i++)mp[i]="Pupil";
    for(int i=1400;i<=1599;i++)mp[i]="Specialist";
    for(int i=1600;i<=1899;i++)mp[i]="Expert";
    for(int i=1900;i<=2099;i++)mp[i]="Candidate master";
    for(int i=2100;i<=2299;i++)mp[i]="Master";
    for(int i=2300;i<=2399;i++)mp[i]="International master";
    for(int i=2400;i<=2599;i++)mp[i]="Grandmaster";
    for(int i=2600;i<=2999;i++)mp[i]="International grandmaster";
    for(int i=3000;i<=40000;i++)mp[i]="Legendary grandmaster";
    int n;
    cin>>n;
    while(n--){
        int m,k,a,d;
        cin>>m>>k;
        while(m--){
            cin>>a;
            d=k+a;
            if(mp[d]!=mp[k])
                cout<<mp[k]<<" -> "<<mp[d]<<endl;
            k+=a;
        }
        cout<<mp[d]<<endl;
    }
    return 0;
}