新学期的训练开始了,先刷个热身题,(寒假荒废太久,都在刷些水题还写了些小东西,不好意思拿出来就不说了)。

这个题读懂意思就很简单了,就是说luras开始了新学期的学习,现在他想逃课写代码,但是没门课最多只能逃课两次,每门课有自己的价值(其实理解为时间我觉得更好),那么问题来了,他用最好的方式逃课最多能逃多少价值的课程。

这里我就很尴尬了,价值我开始想到的是学分,那我想学分肯定是逃分数最低的那些课,然后只有一节两节课的肯定不能逃(逃了不就没学分了吗,挂科好尴尬啊),那就是超过两节的可以开始逃,最多逃两次最少学分的,然而,,,这虽然和example输入一样,但是这是错误的想法

正确的解法是,能逃多少逃多少,逃价值(时间)最高的那两门课,所以这就是一个统计最大两个数的问题。现在知道为什么理解为时间比较好了吧,好吧也许是我语文太差我不反驳~~~

这里用到map会比较简单,用于判断字符串是否存在。


代码:


StatusAccepted
Time124ms
Memory1816kB
Length965
LangC++


#include <iostream>
#include <cstdio>
#include <string>
#include <memory.h>
#include <map>
using namespace std;
#define MAX 1005
map<string, int> imap;
int maxv[MAX][2];
int t, n, v, ans, cnt;
string s;
int main()
{
    scanf("%d", &t);
    while(t--){
        scanf("%d", &n);
        imap.clear();
        memset(maxv, 0, sizeof(maxv));
        ans = 0;
        cnt = 0;
        for(int i=0;i<n;i++){
            cin>>s>>v;
            if(!imap[s]){
                imap[s]=++cnt;
                maxv[cnt][0] = v;
            }
            else{
                int pos = imap[s];
                if(v>maxv[pos][0]){
                    maxv[pos][1] = maxv[pos][0];
                    maxv[pos][0] = v;
                }
                else if(v>maxv[pos][1])maxv[pos][1] = v;
            }
        }
        for(int i=1;i<=cnt;i++){
            ans += maxv[i][0];
            ans += maxv[i][1];
        }
        printf("%d\n", ans);
    }
    return 0;
}