hdu 6015 Skip the Class
题目链接:HDU 6015
一开始读题有点懵,不知道是什么意思,不过后来想到既然是 BestCoder 的题,那么就用它的思维去理解,大胆 yy 题意即可。
题意大概就是说有 n 们课程,Luras 每逃一门都能得到相应的 value,但同一们课程(前面的字符串完全相同)最多只能逃两次,逃两次后就必须去上这们课了,也就不能再获得这们课的后续的 value 了,问 Luras 最多能获得多少 value。所以对于每们课程,只取它最大的两个值即可,然后累加就是答案了,用一个精巧的 map<string, pair<int, int>> 作为数据结构来处理即可。
#include <cstdio> #include <cstring> #include <algorithm> #include <string> #include <map> using namespace std; typedef pair<int, int> pii; int main() { int t,n,v; char ss[20]; map<string, pii> msii; scanf("%d", &t); while(t--) { scanf("%d", &n); msii.clear(); while(n--) { scanf("%s %d", ss, &v); if(msii.find(ss) == msii.end()) { msii[ss] = make_pair(v,0); } else { pii &p = msii[ss]; if(p.second == 0) { if(v > p.first) { p.second = p.first; p.first = v; } else { p.second = v; } } else { if(v > p.first) { p.second = p.first; p.first = v; } else if(v > p.second) { p.second = v; } } } } int sum = 0; for(map<string, pii>::const_iterator it = msii.begin(); it != msii.end(); ++it) { sum += it->second.first + it->second.second; } printf("%d\n", sum); } return 0; }