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

 

posted @ 2017-08-19 18:41  Newdawn_ALM  阅读(183)  评论(0编辑  收藏  举报