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 描述 有些英语单词后缀都是一样的,现在我们需要从给定的一堆单词里 ...
随机推荐
- 浅谈APP的分享功能,有时候社交裂变形式比内容更“重要”
回顾2018年的移动互联网,“社交裂变”“下沉”等成为年度关键词.一方面我们可以看到社交裂变助推用户增长,另一方面我们也看到了以拼多多.趣头条为代表的互联网企业对于社交裂变模式表现出的空前关注度.作为 ...
- pycharm上传代码到码云(详细)
如要转载 麻烦请您备注好原文出处!!!!(谢谢合作!) >>首先要去码云注册个账号 提示(尽量使用英文名)创建用户名 使用邮箱登录 >>然后创建库 >填写项目的基础信息 ...
- POJ 3041 Asteroids 二分图
原题连接:http://poj.org/problem?id=3041 Asteroids Time Limit: 1000MS Memory Limit: 65536K Total Submis ...
- DVBS/S2在数字电视系统中的应用 三 (LNB介绍)
DVBS/S2在数字电视系统中的应用 三 (LNB介绍) 老谢在前面两篇文章中(例如以下).都有提到LNB这一概念. DVBS/S2在数字电视系统中的应用 一 (DVBS/S2接收系统Block Di ...
- mysql 数据迁移时遇到 外键限制
禁用外键约束 SET FOREIGN_KEY_CHECKS=0; ......数据迁移........ 启动外键约束 SET FOREIGN_KEY_CHECKS=1;
- cocos2d-x调用android内嵌浏览器打开网页
cocos2d-x调用android内嵌浏览器打开网页,能够从入口传入网址,C++调用android 的api就可以实现. 方法也非常easy 1. 改动"cocos2dx\platform ...
- Libx264 编码错误 Input picture width(320) is greater than stride (0)
Ffmpeg libx264编码出现 Input picture width(320) is greater than stride (0),问题出在视频格式不正确. libx264 编码要求输入源的 ...
- css实现轮播效果图
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 使用Caffe完成图像目标检测 和 caffe 全卷积网络
一.[用Python学习Caffe]2. 使用Caffe完成图像目标检测 标签: pythoncaffe深度学习目标检测ssd 2017-06-22 22:08 207人阅读 评论(0) 收藏 举报 ...
- 自动提交form表单
<form class="form-inline" name='MD5form' method="post" action="<?php ...