题目链接:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=748&pid=1001

题解:

1.trie树

关键是如何将科目与分数进行对应,即如果将字符串与数字对应。由于之前解除了字典树,所以就想到用字典树存储单词,并为每种编上编号,之后就用这个编号与分数对应。

就个人观点而言,a[][]数组应该不用清零,因为下个case会将之前的case覆盖掉,但是错了,也找不出原因。所以以后为了安全起见,不管是否会被覆盖,都清零吧,这样保险一点。

代码如下:

 #include<bits/stdc++.h>//字典树  

 using namespace std;  

 int a[][],deg[], b[],vis[],sum;
//a[][]记录单词的值,从1开始记录。deg[]记录单词有多少个值。sum为单词的种数。 typedef struct node//字典树的结点
{
struct node *next[];
int pos;
}Trie, *PT; int init(PT &p)//初始化结点
{
p = (PT)malloc(sizeof(Trie));
p->pos = ;
for(int i = ; i<; i++)
p->next[i] = NULL;
} //访问字典树,若果单词已存在,则返回这个单词的编号,如果不存在,则编号加1,并返回。
int trie(char *s, int k, PT &p)
{
if(!s[k])
{
if(p->pos) return p->pos;
p->pos = ++sum;
return p->pos;
} else
{
if(!p->next[s[k]-'a'])
init(p->next[s[k]-'a']);
return trie(s,k+,p->next[s[k]-'a']);
}
} int cmp(int a,int b)
{
return a > b;
} int main()
{
int T,n,val,ans;
char s[];
PT p;
scanf("%d",&T);
while(T--)
{
init(p);
scanf("%d",&n);
ans = ; sum = ;
memset(deg,,sizeof(deg));
memset(vis,,sizeof(vis));
memset(a,,sizeof(a));//为什么少了这步会出错,这步好像不是必要的吧?
for(int i = ; i<n; i++)
{
scanf("%s%d",s,&val);
b[i] = trie(s,,p);//获取单词的编号,并将其储存到b[]中,
a[b[i]][deg[b[i]]++] = val;//更新a数组和deg数组
} for(int i = ; i<n; i++)
{
if(!vis[b[i]])//如果没有访问编号为b[i]的单词,则访问。
{ //对这个单词的值进行排序,选其前二,并标为已访问。
sort(a[b[i]],a[b[i]]+deg[b[i]],cmp);
vis[b[i]] = ;
ans += a[b[i]][] + a[b[i]][];
}
}
printf("%d\n",ans);
}
return ;
}

2.map容器

其实做题时想到用c++的map会很方便,只可惜没有学map的操作。也好,现在补回来了。

对于map的认识:

1.map一个key只能对应一个val,而multimap一个key能对应多个val。所以如果对map的key进行多次复制,其旧val会被新val覆盖。而multimap则插入新的val。

2.由于map一对一,所以可以直接用map[key] = val,以数组的形式直接赋值,而multimap则只能用map.insert(pair<string,int>("ss",11))进行插入赋值。

3.要访问元素要使用迭代器map<string,int>::iterator it,last; 4

4.两种map都自动根据key值进行递增排序。

代码如下:

 #include<bits/stdc++.h>
#define MAX(a,b) (a>b?a:b) using namespace std; int main()
{
int n,val,T;
char s[];
map<string,int> m1,m2;
map<string,int>::iterator it,last;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
m1.clear(); m2.clear();//清空map
for(int i = ; i<n; i++)
{
scanf("%s%d",s,&val);
//更新第一二大值
m2[s] = MAX(m2[s],val);
if(m1[s]<m2[s]) swap(m1[s],m2[s]);
} int ans = ;
for(it = m1.begin(),last = m1.end(); it!=last; it++)
ans += it->second;
for(it = m2.begin(),last = m2.end(); it!=last; it++)
ans += it->second;
printf("%d\n",ans);
}
return ;
}

BestCoder Round #92 1001 Skip the Class —— 字典树 or map容器的更多相关文章

  1. 贪心 BestCoder Round #39 1001 Delete

    题目传送门 /* 贪心水题:找出出现次数>1的次数和res,如果要减去的比res小,那么总的不同的数字tot不会少: 否则再在tot里减去多余的即为答案 用set容器也可以做,思路一样 */ # ...

  2. 暴力 BestCoder Round #41 1001 ZCC loves straight flush

    题目传送门 /* m数组记录出现的花色和数值,按照数值每5个搜索,看看有几个已满足,剩下 5 - cnt需要替换 ╰· */ #include <cstdio> #include < ...

  3. 暴力 BestCoder Round #46 1001 YJC tricks time

    题目传送门 /* 暴力:模拟枚举每一个时间的度数 详细解释:http://blog.csdn.net/enjoying_science/article/details/46759085 期末考结束第一 ...

  4. 字符串处理 BestCoder Round #43 1001 pog loves szh I

    题目传送门 /* 字符串处理:是一道水题,但是WA了3次,要注意是没有加'\0'的字符串不要用%s输出,否则在多组测试时输出多余的字符 */ #include <cstdio> #incl ...

  5. BestCoder Round #75 1001 - King's Cake

    Problem Description It is the king's birthday before the military parade . The ministers prepared a ...

  6. 山东第一届省赛1001 Phone Number(字典树)

    Phone Number Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 We know that if a phone numb ...

  7. hdu 5195 DZY Loves Topological Sorting BestCoder Round #35 1002 [ 拓扑排序 + 优先队列 || 线段树 ]

    传送门 DZY Loves Topological Sorting Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131 ...

  8. hdu1251 字典树or map

    一道字典树的题,不过看起来用map更为简单 传送门 题意: 给出一堆字符串构成一个字典,求字典里以某字符串为前缀的字符串有几个 思路: 输入字符串时把字符串的前缀全部存进map并标记次数 查询时直接输 ...

  9. TOJ3097: 单词后缀 (字典树 or map瞎搞)

    传送门 (<---可以点击的~) 时间限制(普通/Java):1000MS/3000MS     内存限制:65536KByte 描述 有些英语单词后缀都是一样的,现在我们需要从给定的一堆单词里 ...

随机推荐

  1. JavaScript实现弹幕效果

    效果如下 <html> <head> <title></title> <script src="https://cdn.staticfi ...

  2. kafka技术分享02--------kafka入门

    kafka技术分享02--------kafka入门 1. 消息系统 ​ 所谓的Messaging System就是一组规范,企业利用这组规范在不同的系统之间传递语义准确对的消息,实现松耦合的异步数据 ...

  3. Ubuntu 16.04下使用Wine安装Windows版的微信(不太完美)

    说明: 真的不太完美,别试了:除了需要安装额外的输入法之后,无法上传图片和间接性的BUG出现等等问题. 建议安装网页版的微信:http://www.cnblogs.com/EasonJim/p/711 ...

  4. javascript --- 继承小结

    回顾之前学到的知识,大体上可以分为两类: 1. 基于构造器工作的模式. 2. 基于对象的工作模式. 3. 是否使用原型 4. 是否执行属性拷贝. 5. 两者都有(执行原型属性拷贝) 下面我们把之前的知 ...

  5. OpenCV学习教程入门篇&lt;一、介绍&gt;

    OpenCV,是Inter公司开发的免费开源专门因为图像处理和机器视觉的C/C++库,英文全称是Open Source Computer Vision. 1. 可视化语言Matlab与OpenCV都能 ...

  6. iOS加急审核之2015年总结

    就在今天到公司的一会,查看了一下邮件,收到Apple的回复,今年的第六次加急审核通过了. 然后,想想明天就是西方的圣诞节假期了,从22日到29日的这段时间,Apple会暂时关闭iTunesconnec ...

  7. 网站的根目录下有一个文件robots.txt ,它是啥?

    我相信很多人有过这个疑问,这个robots文件是干嘛的? 我想问,各位搜索淘宝时,是否发现(禁止爬虫抓取提供快页) 关于详细语法,请看:http://zhidao.baidu.com/question ...

  8. 重置浏览器的默认样式(css reset)

    (1)定义:首先css reset指的是重置浏览器的默认样式 (2)作用:因为现在的浏览器很多,并且每个浏览器都有自己的默认样式,这样就会导致一个页面在多个浏览器下展示产生差异,所以我们需要做一些处理 ...

  9. linux 启动ftp服务,sftp服务

    启动ftp服务:yum install vsftpd 在/etc/rc.d/init.d/目录下:命令 service vsftp start启动ssh服务,sftp服务在/etc/init.d/目录 ...

  10. GuozhongCrawler系列教程 (1) 三大PageDownloader

    GuozhongCrawler  QQ群 202568714 教程源代码下载地址:http://pan.baidu.com/s/1pJBmerL GuozhongCrawler内置三大PageDown ...