BestCoder Round #92 1001 Skip the Class —— 字典树 or map容器
题目链接: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容器的更多相关文章
- 贪心 BestCoder Round #39 1001 Delete
题目传送门 /* 贪心水题:找出出现次数>1的次数和res,如果要减去的比res小,那么总的不同的数字tot不会少: 否则再在tot里减去多余的即为答案 用set容器也可以做,思路一样 */ # ...
- 暴力 BestCoder Round #41 1001 ZCC loves straight flush
题目传送门 /* m数组记录出现的花色和数值,按照数值每5个搜索,看看有几个已满足,剩下 5 - cnt需要替换 ╰· */ #include <cstdio> #include < ...
- 暴力 BestCoder Round #46 1001 YJC tricks time
题目传送门 /* 暴力:模拟枚举每一个时间的度数 详细解释:http://blog.csdn.net/enjoying_science/article/details/46759085 期末考结束第一 ...
- 字符串处理 BestCoder Round #43 1001 pog loves szh I
题目传送门 /* 字符串处理:是一道水题,但是WA了3次,要注意是没有加'\0'的字符串不要用%s输出,否则在多组测试时输出多余的字符 */ #include <cstdio> #incl ...
- BestCoder Round #75 1001 - King's Cake
Problem Description It is the king's birthday before the military parade . The ministers prepared a ...
- 山东第一届省赛1001 Phone Number(字典树)
Phone Number Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 We know that if a phone numb ...
- 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 ...
- hdu1251 字典树or map
一道字典树的题,不过看起来用map更为简单 传送门 题意: 给出一堆字符串构成一个字典,求字典里以某字符串为前缀的字符串有几个 思路: 输入字符串时把字符串的前缀全部存进map并标记次数 查询时直接输 ...
- TOJ3097: 单词后缀 (字典树 or map瞎搞)
传送门 (<---可以点击的~) 时间限制(普通/Java):1000MS/3000MS 内存限制:65536KByte 描述 有些英语单词后缀都是一样的,现在我们需要从给定的一堆单词里 ...
随机推荐
- GRDB使用SQLite的WAL模式
GRDB使用SQLite的WAL模式 WAL全称是Write Ahead Logging,它是SQLite中实现原子事务的一种机制.该模式是从SQLite 3.7.0版本引入的.再此之前,SQLi ...
- gitlab升级、汉化、修改root密码
1.gitlab升级 # 查看当前版本 head -1 /opt/gitlab/version-manifest.txt gitlab-ce 8.9.5 grep "^external_ur ...
- SpringBoot中@EnableAutoConfiguration注解用法收集
参考: http://blog.csdn.net/xiaoyu411502/article/details/52770723 https://docs.spring.io/spring-boot/do ...
- "visual studio 2012 安装引擎拒绝访问" 错误的解决
首先,我们看一下错误的具体提示,如下图所示: 这个错误,是我安装了那么多年Visual Studio的经历中,第一次遇到.太恶心了,昨天一直安装失败,导致后续其它软件的安装一再拖延.目前网上的解决方案 ...
- 转:国内外著名开源b2c电子商务系统比较包括asp.net和php
from: http://longdick.iteye.com/blog/1122879 国内外著名开源b2c电子商务系统比较包括asp.net和php 博客分类: 电子商务 国内外著名开源b2c ...
- 第一个AngularJS Sample
代码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3. ...
- 系统安全-Man in the middleattack
窃听VS加密(解决数据机密性) 加密由两部分组成:算法&秘钥(算法要够复杂,秘钥要够安全) 对称加密:(Symmetric encryption) 采用单秘钥密码系统的加密方法,同一个秘钥可以 ...
- Error (167005): Can't assign I/O pad "GX_TX" to PIN_AG27 because this causes failure in the placement of the other atoms in its associated channel
1.同时在两个GX的bank,建立两GX ip core 会出现 两个IP的cal_blk_clk信号,要保持是同一个时钟
- 动态控制body最小高度
//动态控制body最小高度 var windowHeight = $(document).height() - 164; $(".body-content").css({ &qu ...
- mysql导入数据库_仅仅用frm向mysql导入表结构
网上一个连接mysql的jsp代码段,给了数据库的备份文件.可是仅仅有frm, mysql的每张表有三个文件.各自是,*.frm是描写叙述了表的结构.*.MYD保存了表的数据记录.*.MYI则是表的索 ...