PAT 1140

题目 : Look-and-say Sequence

分值 : 20
难度 : 简单题
思路 : 对一个s每次遍历,作出处理,然后重复N次,得到结果。
坑点 : 在对string 处理时,有一个拼接的操作,如果使用 s = s+temp 就会超时,而 s+= temp 就不会

具体代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;
typedef struct Node
{
string name ;
int Gp =-1;
int Gmid_term = -1 ;
int Gfinal = -1;
int G;
}Nodes ;
map <string , Node> db;
map<string , Node>:: iterator itea ;
typedef pair<string ,Node> PAIR ;
vector<PAIR> vec ;
bool cmp(const PAIR& a , const PAIR & b)
{
if(a.second.G != b.second.G)
return a.second.G > b.second.G ;
return a.second.name < b.second.name ;
}

int main() {
int p , m , n ;
cin >> p >> m >> n ;
string name ;
int value ;
for(int i = 0 ; i< p+m+n ; i++)
{
cin >> name >> value;
if(i<p)
{
db[name].name = name ;
db[name].Gp = value ;
}
else if(i<p+m)
{
db[name].name = name ;
db[name].Gmid_term = value ;
}
else
{
db[name].name = name ;
db[name].Gfinal =value ;
}
}
for(itea =db.begin(); itea != db.end() ; itea ++)
{
if(itea->second.Gmid_term > itea->second.Gfinal)
{
double result = 0.4*itea->second.Gmid_term + 0.6 *itea->second.Gfinal ;
itea->second.G = result + 0.5 ;
}
else
itea->second.G = itea->second.Gfinal ;
vec.push_back( make_pair(itea->first, itea->second )) ;
}
sort(vec.begin(), vec.end() , cmp) ;
for(int i = 0 ; i< vec.size( ) ; i++)
{
if(vec[i].second.Gp < 200 || vec[i].second.G <60 ) continue ;
cout <<vec[i].second.name<<" "<<vec[i].second.Gp <<" "<<vec[i].second.Gmid_term <<" "<<vec[i].second.Gfinal<<" "<<vec[i].second.G <<endl ;
}
}